在前几天微软的Build大会上,微软释放出了其下一代的编译器的Roslyn的新的预览版本,借助其开放 C# 和 Visual Basic 编译器的 API,使得开发者可以借助编译器进行解析代码文件、动态为编程语言增加功能、扩展编译器、自定义编译器动作等操作。
在其End User Preview的示例扩展中,借助其实现了几个之前微软在文章中Probable C# 6.0 features illustrated提到了一些可能会加入到C# 6.0中的新语法。(官方并未确定,不过应该八九不离十了),这里就简单的演示一下。
主构造函数(Primary Constructors)
我们通常通过构造函数给属性赋初值,一个常见的例子如下:
class Point
{
public int X { get; set; }
public int Y { get; set; }
public Point(int x, int y)
{
this.X = x;
this.Y = y;
}
}
现在, 通过过给类定义一个主构造函数,我们可以简化代码如下:
class Point(int x, int y)
{
public int X { get; set; } = x;
public int Y { get; set; } = y;
}
或者给只读属性附初值
class Point(int x, int y)
{
public int X { get; } = x;
public int Y { get; } = y;
}
其实这儿不限于属性,字段也可以也这种方式初始化。
自动属性初始化器
这个则是VB中已经有的一个语法,在当前的C#语法中,要给一个属性赋自动初值,一般有两种方式:
1. 在构造函数中:
class Point
{
public int X { get; private set; }
public int Y { get; private set; }
public Point()
{
this.X = 100;
this.Y = 100;
}
}
2. 使用属性封装
class Point
{
int x = 100;
public int X
{
get { return x; }
private set { x = value; }
}
int y = 100;
public int Y
{
get { return y; }
private set { y = value; }
}
}
使用自动属性初始化时,代码则可简化如下:
class Point
{
public int X { get; private set; } = 100;
public int Y { get; private set; } = 100;
}
using静态类(Static type using statements)
这个也是一个VB的特性了,在加上using 静态类的声明后,我们就可以不通过类名直接调用函数了,例如,如下代码:
Math.Sqrt(Math.Round(5.142));
可以简化如下:
using System.Math;
Sqrt(Round(5.142));
如果在大量使用数学运算的时候看起来要舒服得多了。
内联out参数定义(Inline declarations for out params)
这个是我非常喜欢的一个特性。以前有out参数的地方的时候,必须先声明一个临时变量,如下所示:
int x;
int.TryParse("123", out x);
现在我们则可以把它写成如下形式了:
int.TryParse("123", out var x);
就算需要out参数的返回值也可以一行代码搞定:
var result = int.TryParse("123", out var x) ? x : 0;
成员索引(Indexed members)
这个语法之前倒是没有看到介绍,主要实现的是以类似成员的方式访问索引,示例如下:
class MyClass
{
public string this[string index]
{
get { return "hello " + index; }
}
public void foo()
{
var result = this.$world;
Console.WriteLine(result); //这里输出 hello world
}
}
不过这里我倒没有看出来有多大便利。
其它的一些语法里没有得到支持,毕竟这个只是一个通过预览版的插件扩展。 CSDN里有篇文章C# 6.0新特性抢先看介绍了一些更多的特性。CodePlex上则有一份官方的明细Language feature implementation status,看来这次C# 6.0有比较大的变更。