是C#的全新特性!

  1. 可空引用类型
    举个例子,我们现在创造一个字符串
    string str = "creeper?"; 或者string str;都是可以正常通过编译的,但是通常不允许string str = null; 出现。在C#8.0以上的版本中,提供了可空引用类型T? ,所以使用该类型的string? str = null;是可以的。
    但是在使用可空引用类型T?前,必须对其是否为空进行检查,否则编译器就会核谐地丢给你一个警告。不要以为你永远用不到这个,至少事实上Console.ReadLine().返回的是string?,而不是string。

  2. 更好的切片
    Python的优点之一就是其优雅的字符串切片查找以及列表索引。现在C#也支持从前面或者后面进行查找了,具体方法非常简单,就是把它的正面索引进行按位取反,例如:

int i = 1;
int j = ^2;
int[] list = {1,1,4,5,1,4}
//list[i] = 1 list[j] = 5
  1. 不再那么恶毒的接口
    发布接口是一个需要小心的事情,你必须在一开始就做好所有的成员,如果你在后期试图修改接口,那么极有可能会与其它使用该接口的开发者结下血海深仇。为了降低C#人的死亡率,接口现在支持在未被其他人实现的情况下使用自己的默认实现。
    比如我们发布了一个接口ICrashHandler,定义如下:
interface ICrashHandler
{
    void CrashHandler(string lev,string reason);
    //什么,你还没实现吗?
   // 那我先帮你实现了,有空要补上啊
    void CrashHandler(Exception e) => CrashHandler("err",e.Message)
}
  • 这样继承与该接口的类就不必实现CrashHandler方法。
  1. 雷霆战机
    switch语句一向因为其恶臭而闻名中外,某些人(包括我)宁可疯狂if大叠也不愿意写上一句switch。现在C#提供了模式化的switch表达式,简洁高效,令人欲罢♂不能。例如这里的语句可以计算直线,方形,圆形的面积:
var area = figure switch 
{
    Line _      => 0, //既然是零就不需要具体的字段了
    Rectangle r => r.Width * r.Height,
    Circle c    => c.Radius * 2.0 * Math.PI,
    _           => throw new UnknownFigureException(figure) //相当于default
};
  • 更多用法请看这里∶


  1. 偷懒大师
    在以前,我们要创建一组点要使用如下语句:Point[] ps = { new Point(1, 4), new Point(3,-2), new Point(9, 5) };
    而现在可以直接使用Point[] ps = { new (1, 4), new (3,-2), new (9, 5) };来创建。

你可能感兴趣的:(是C#的全新特性!)