出售域名 11365.com.cn
有需要请联系 16826375@qq.com
在手机上浏览
在手机上浏览

c#6.0,7.0新特性

发布日期:2018-12-20

最近看了下c#6.0,7.0的新特性,捡了几个我认为比较有意思的介绍一下!

1.自动属性初始化(Auto-property initializers)
public int Age { get; set; } = 22;
相当于隐式创建有一个成员变量int _Age=22; 并赋初值给getter。

2.字符串嵌入值(String interpolation)
实际上是string.Format的简化。
原:string book=string.Format("这是一本{0}书",book.BookType);
新:string book=$"这是一本{book.BookType}书";
延伸:$@"select *
from
{tableName}"
$和@组合使用,虽然分行但仍然是一条语句,且可以嵌入值

可以看出,string.Format用$代替,不用{0}{1}等占位符,直接用对象替换。有趣的是,和NVelocity模板语法很相似,如:"我的名字是:${user.UserName}"。
这个特性很实用。

3.空值运算符(Null-conditional operators)
这个运算符看起来怪怪的,有点像三元运算符?:。
实际上是这样的?.,解释起来就是判断?前的对象是否为空,不为空就继续往下走,减少了抛出对象为空的错误的情况。对于要获取对象深层子对象还是挺有用的。
比如 

string levelName=user?.UserLevel?.LevelName;
var cont=currNode?.GetSingleCont();

4.在属性里使用Lambda表达式(Expression bodies on property-like function members)
一句话的方法体,可以用lambda表达式简化
原:public int Age { get { return 18; } }
新:public int Age => 18;

5.在方法上使用Lambda表达式
一句话的方法体,可以用lambda表达式简化
原:public int GetAge() { return 18; }
新:public int GetAge() => 18;

6.out-variables(Out变量)
out变量不需要事先声明了,直接在参数里声明
原:
int loginCount=0;
public void Login(out loginCount)
新: 
public void Login(out int loginCount)

7.Tuples(元组)
元组用于返回多个结果。

public (string a,string b,string c) GetAddr()
{
    return ("china", "guangdong", "shenzhen");
}
string boy = "jsonlee";
(string country, string province, string city) addr = GetAddr(); //指定参数别名
app.Run(context => context.Response.WriteAsync($"Hello World:{boy},Addr:{addr.country},{addr.province},{addr.city}"));

输出:
Hello World:jsonlee,Addr:china,guangdong,shenzhen

元组还是挺好玩的,适合用于返回多个参数,但并非同类型的场景下,不过也有很多替代办法,比如封装成一个对象,或者用json数据格式。元组用于返回值看起来不是很简洁,可能也是大家用得不多的原因。

8.Pattern Matching(匹配模式)
自动检测数据的类型,对is的扩展。

object a = 1;
if (a is int c) //这里,判断为int后就直接赋值给c
{
  int d = c + 10;
}


类型转换,似乎只有object对象才能这样写。