C# 6.0新特性抢先看
鉴于C# 6.0的新特性已经在网上曝光,在不违反NDA的情况下,把我知道的一些已经公开的新特性和大家分享,这些特性可能会在最终版本中有所不同,只是让大家抢个鲜。大家知道C# 4.0以后,微软很少对它有更新了,VS2013更是罕见地成为一个根本没有更新C#的VS发布版本。但是长时间的寂静之后是一次爆发!
首先要说的叫做自动属性初始化器。这个特性实际上VB.NET已经有了。比如我们写如下代码:
class User
{
public List<Role> Roles { get; set; }
}
这代码有什么缺点呢?那就是new一个User出来,Roles是null。可能你会用如下两个办法之一解决:
(1)不用自动属性
class User
{
private List<Role> roles = new List<Role>();
public List<Role> Roles { get { return roles; } set { roles = value; } }
}
(2)使用构造函数
class User
{
public List<Role> Roles { get; set; }
public User() { Roles = new List<Role>(); }
}
现在你可以这么写:
class User
{
public List<Role> Roles { get; set; } = new List<Role>();
}
是不是很简单?
你还可以用它来写只读属性,比如这个List,我们一般只需要添加删除元素的操作,而指向另一个List似乎没有必要,那么我们可以定义成只读的。
class User
{
public List<Role> Roles { get; } = new List<Role>();
}
然后是主构造函数,你可以给类定义一个主构造函数,这个构造函数的参数在类的声明中直接写,比如:
class Point
{
public int X { get; set; }
public int Y { get; set; }
public Point(int x, int y)
{
X = x;
Y = y;
}
}
现在可以这么写了:
class Point(int x, int y)
{
public int X { get; set; } = x;
public int Y { get; set; } = y;
}
我们同时也用了之前说的自动属性初始化器
其实不一定是自动属性,字段也是可以的。
然后是继承构造函数
比如
class ColoredPoint : Point
{
public Color PointColor { get; set; }
public ColoredPoint(Color color, int x, int y) : base(x, y)
{
PointColor = color;
}
}
现在可以这么写:
class ColoredPoint(Color color, int x, int y) : Point(x, y)
{
public Color PointColor { get; set; } = color;
}
现在,我们可以用类似Lambda表达式的方式编写get属性,比如
class Rect
{
public int Height;
public int Width;
public int Area { get { return Height * Width; } }
}
现在可以这么写:
class Rect
{
public int Height;
public int Width;
public int Area => Height * Width;
}
还有using静态类,这个特性可以简化很多代码,比如:
using System;
...
Console.WriteLine(Math.Abs(-1.2d));
现在我们可以像using命名空间一样直接using静态类:
using System.Console;
using Math;
...
WriteLine(Abs(-1.2d));
其实有很多这样可以简化代码的语法糖,我不给代码了,只是大概说说,详细的请看这里
http://damieng.com/blog/2013/12/09/probable-c-6-0-features-illustrated
方法扩展,像Lambda那样定义方法
不定个数参数现在支持IEnumerable,不仅仅是数组了
null检查运算符,简化了多个对象内嵌层级判断null的代码
构造函数参数可以作用于泛型类型自动推定
二进制初始化器,对于定义位掩码、二进制数据很有用
内联out参数定义,以前需要单独一行定义一个用于函数out参数的变量,现在不要了
类初始化器不但可以初始化属性,也可以初始化事件了
接口包装,可以在对象中定义一个实现了接口的类型来代替这个对象实现接口
改进的集合初始化器现在可以对下标赋值
...
如果你觉得C#的改进只是小打小闹那就错了,C# 6.0将会在动态类型、异步编程、函数式编程、DSL和元编程、并行等方面有很多重大的改进,因为保密的原因,我不多说了,在合适的时机大家就能看到。
另外透露两个重要的消息:
C# 6.0编译器使用C#实现,并且微软将开放源代码。
C#语言、编译器将和Roslyn项目统一,微软将深度开放编译器的二次开发接口。这样的接口有什么用?我们可以用它做很多事情,比如用词法、语法解析增强编译器,或者写脚本语言,我们可以很容易开发语法高亮、代码分析、重构、根据代码绘制UML等反向建模、代码转换(比如开发一个Java->C#或者C#->VB.NET)等等程序。