C#6.0中10大新特性的应用和总结
微软于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 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 string name { get; }
public customer(string first, string last)
{
name = first + " " + last;
}
}
2.字符串嵌入值(string interpolation)
在之前版本的string.format中有多少个参数就要写多少个占位符还必须按照顺序,否则就报错.参数一多,这样搞的话确实头疼.新版本中在字符串前用$来标识后边的字符可以使用{对象}来作为占位符.看个例子.
console.writeline($"年龄:{account.age}");
console.writeline($"{(account.age<=22?"小鲜肉":"老鲜肉")}");
如果想输出{或}符号,写两个即可,如$"{{".
注意这个$符号,网上的n多教程都是没有这个东东的.是直接"\{ account.age \}",这种方式在新版本里已经被抛弃了.
3.导入静态类(using static)
像之前使用math这个静态类的时候要先导入system命名空间后才能使用它.现在可以直接导入这个静态,然后代码中直接使用其函数.
console.writeline($"之前的使用方式: {math.pow(4, 2)}");
console.writeline($"导入后可直接使用方法: {pow(4,2)}");
注意这里是using static ...
如果某个命名空间下有n个方法,用这种方式直接引入单个静态类而不用引用所有方法还是挺方便的.
4.空值运算符(null-conditional operators)
之前写过无数个这样的判断代码
{
//不为null的操作
}
return null;
现在使用可以简化这样方式.
console.writeline("{0}", (person.list?.count ?? 0));
如果account.agelist为空则整个表达式返回空,否则后边的表达式的值.
5.对象初始化器(index initializers)
这种方式可以给字典或其他对象通过索引赋值初始化.
[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)
{
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)
在对方法参数进行检查时经常这样写:
{
if (account == null)
throw new argumentnullexception("account");
}
如果某天参数的名字被修改了,下面的字符串很容易漏掉忘记修改.
使用nameof表达式后,编译的时候编译器将检查到有修改后自动导航与重构(-_-! 不知道翻译的对不对)
{
if (account == null)
throw new argumentnullexception(nameof(account));
}
8.在cath和finally语句块里使用await(await in catch and finally blocks)
c#5.0里是不支持这么写.
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 void print() => console.writeline(name);
10.在方法成员上使用lambda表达式
public void print() => console.writeline(first + " " + last);
关于c#6.0新增加的语言特性目前为止也就这么多.没有什么新功能,更多的是语法糖的改进.开发更舒服更快速.
下一篇: 详解C#切换窗口