今天在MSDN上看到的微軟關於微軟關於C# 7.0特性的Work List,主要特性如下:
Tuple的可讀性一直不是很好, 很多時候寧願新寫一個類也不使用Item1, Item2這種不知何物的屬性:
public Tuple<int, int> Tally(IEnumerable<int> values) { ... }
var t = Tally(myValues);
Console.WriteLine($"Sum: {t.Item1}, count: {t.Item2}");
在C# 7.0中,則可以寫成如下方式:
public (int sum, int count) Tally(IEnumerable<int> values)
{
var s = 0; var c = 0;
foreach (var value in values) { s += value; c++; }
return (s, c); // target typed to (int sum, int count)
}
(var sum, var count) = Tally(myValues); // deconstruct result
Console.WriteLine($"Sum: {sum}, count: {count}");
這個基本上就是F#的那種寫法了,可讀性要好得多。
模式匹配最開始在C# 6.0的語法計划中見過,現在在C# 7.0中又見一次:
Expr Simplify(Expr e)
{
switch (e)
{
case Mult(Const(0), *): return Const(0);
case Mult(*, Const(0)): return Const(0);
case Mult(Const(1), var x): return Simplify(x);
case Mult(var x, Const(1)): return Simplify(x);
case Mult(Const(var l), Const(var r)): return Const(l * r);
case Add(Const(0), var x): return Simplify(x);
case Add(var x, Const(0)): return Simplify(x);
case Add(Const(var l), Const(var r)): return Const(l + r);
case Neg(Const(var k)): return Const(-k);
default: return e;
}
}
看起來還是很不錯的,對於需要的場合能大幅減少代碼,感覺模式匹配和Tuples要搭配使用的,估計要有會一塊都有吧。
這個也是非常早就見過有人提出的,如果能正式啟用的話還是非常給力的,代碼里面那些地方要加NULL判斷就非常明晰了,並且不會出現無法UT的NULL判斷了。
Dog! mandatoryDog = new Dog("Mandatory");
mandatoryDog.Bark(); // OK - can call method on mandatory reference.
string name = mandatoryDog.Name; // OK - can access property on mandatory reference.
異步支持的增強
這個也是一個比較大的改動,可能會對using, yield之類的語法糖加入異步支持,並引入IAsyncDisposable等,處理異步迭代就非常方便了,由於沒找到什么合適的例子,這里就不列舉了。
其它
另外還有其它許多非常有用的語法,感興趣的朋友可以去https://github.com/dotnet/roslyn/issues/2136這兒看看。不過幾乎可以肯定的是,C# 7.0不會支持這么多語法,倒是希望它能支持那些主要特性。