欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

C#6.0中10大新特性的应用和总结

程序员文章站 2022-11-23 23:41:47
微软于2015年7月21日发布了visual studio 2015, .net 2015, .net framework 4.6, asp.net 4.6, azure...

微软于2015年7月21日发布了visual studio 2015, .net 2015, .net framework 4.6, asp.net 4.6, azure sdk 2.7 for .net, c# 6.0, f# 4.0, typescript 1.5, visual studio android 模拟器 等重量级开发产品。

由于项目升级到了.netframework 4.6.1,开发工具转向了vs2015,趁机尝试下c#6.0。结果网上的教程不进人意,许久都没有更新,只好自己做一下总结。

1.自动属性初始化(auto-property initializers)

复制代码 代码如下:
public class account
{
 
    public string name { get; set; } = "summit";
 
    public int age { get; set; } = 22;
 
    public ilist<int> agelist
    {
        get;
        set;
    } = new list<int> { 10,20,30,40,50 };
 
}

对于只读属性也可以这样直接初始化(c#5.0不支持),也可以直接在构造函数里初始化

复制代码 代码如下:
public class customer
{
    public string name { get; }
    public customer(string first, string last)
    {
        name = first + " " + last;
    }
}

2.字符串嵌入值(string interpolation)

在之前版本的string.format中有多少个参数就要写多少个占位符还必须按照顺序,否则就报错.参数一多,这样搞的话确实头疼.新版本中在字符串前用$来标识后边的字符可以使用{对象}来作为占位符.看个例子.

复制代码 代码如下:
console.writeline($"年龄:{account.age}  生日:{account.birthday.tostring("yyyy-mm-dd")}");
console.writeline($"年龄:{account.age}");
console.writeline($"{(account.age<=22?"小鲜肉":"老鲜肉")}");

如果想输出{或}符号,写两个即可,如$"{{".
注意这个$符号,网上的n多教程都是没有这个东东的.是直接"\{ account.age \}",这种方式在新版本里已经被抛弃了.

3.导入静态类(using static)

像之前使用math这个静态类的时候要先导入system命名空间后才能使用它.现在可以直接导入这个静态,然后代码中直接使用其函数.

复制代码 代码如下:
using static system.math;//注意这里不是命名空间哦
 
console.writeline($"之前的使用方式: {math.pow(4, 2)}");
console.writeline($"导入后可直接使用方法: {pow(4,2)}");

注意这里是using static ...
如果某个命名空间下有n个方法,用这种方式直接引入单个静态类而不用引用所有方法还是挺方便的.

4.空值运算符(null-conditional operators)

之前写过无数个这样的判断代码

复制代码 代码如下:
if (*** != null)
{
     //不为null的操作
}
return null;

现在使用可以简化这样方式.

复制代码 代码如下:
var age = account.agelist?[0].tostring();
 
console.writeline("{0}", (person.list?.count ?? 0));

如果account.agelist为空则整个表达式返回空,否则后边的表达式的值.

5.对象初始化器(index initializers)

这种方式可以给字典或其他对象通过索引赋值初始化.

复制代码 代码如下:
idictionary<int, string> dict = new dictionary<int, string>() {
       [1]="first",
       [2]="second"
};
foreach(var dic in dict)
{
    console.writeline($"key: {dic.key} value:{dic.value}");
}

output:
key: 1 value:first
key: 2 value:second

6.异常过滤器(exception filters)

复制代码 代码如下:
private static bool log(exception e)
{
    console.writeline("log");
    return true;
}
static void testexceptionfilter()
{
    try
    {
        int32.parse("s");
    }
    catch (exception e) when (log(e))
    {
        console.writeline("catch");
        return;
    }
}

当when()里面返回的值不为true,将持续抛出异常,不会执行catch里面的方法.

7.nameof表达式 (nameof expressions)

在对方法参数进行检查时经常这样写:

复制代码 代码如下:
private static void add(account account)
{
     if (account == null)
         throw new argumentnullexception("account");
}

如果某天参数的名字被修改了,下面的字符串很容易漏掉忘记修改.
使用nameof表达式后,编译的时候编译器将检查到有修改后自动导航与重构(-_-! 不知道翻译的对不对)

复制代码 代码如下:
private static void add(account account)
{
     if (account == null)
         throw new argumentnullexception(nameof(account));
}

8.在cath和finally语句块里使用await(await in catch and finally blocks)

c#5.0里是不支持这么写.

复制代码 代码如下:
resource res = null;
try
{
    res = await resource.openasync(…);       // you could do this.
    …
}
catch(resourceexception e)
{
    await resource.logasync(res, e);         // now you can do this …
}
finally
{
    if (res != null) await res.closeasync(); // … and this.
}

9.在属性里使用lambda表达式(expression bodies on property-like function members)

复制代码 代码如下:
public string name =>string.format("姓名: {0}", "summit");
 
public void print() => console.writeline(name);

10.在方法成员上使用lambda表达式

复制代码 代码如下:
static int lambdafunc(int x, int y) => x*y;
 
public void print() => console.writeline(first + " " + last);

关于c#6.0新增加的语言特性目前为止也就这么多.没有什么新功能,更多的是语法糖的改进.开发更舒服更快速.