当前位置: 移动技术网 > IT编程>开发语言>c# > C#6.0中10大新特性的应用和总结

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

2019年07月18日  | 移动技术网IT编程  | 我要评论

微软于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新增加的语言特性目前为止也就这么多.没有什么新功能,更多的是语法糖的改进.开发更舒服更快速. 

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网