C#のプログラムマネージャであるMads Torgersen氏がQCon New York 2016でC# 7について語った。また、C#の進化と将来のバージョンの機能についても簡単に説明した。
ここ数年のクラウドと分散システムの勃興は開発者に新しい課題をもたらした。言語も開発者の進化に追従しなければならない。C#のような多目的言語の進化とは複数の関心事のバランスを取ることだ。
- 改良することとシンプルさを保つこと
- 既存の開発を改善することと新しいユーザを惹きつけること
- 新しいパラダイムを取り入れることとオブジェクト指向の精神を保つこと
.Net自体もここ数年で大きく変化した。
- Windows、Mac、Linuxのサポート(.Net Core)
- 配置システム
- ネイティブコードへのコンパイル(.Net Native)
- オープンソースコンパイラとパブリックなRoslyn API
- 複数のエディタ選択肢(OmniSharpとRoslynによって可能になった)
- オープンソースフレームワークとツール
C# 7
C# 7はVisual Studio 15に同梱される。現時点ではプレビューだ。新しい言語の機能を早く有効にするため、ポイントリリースも検討されている。実現すればマイナーリリースに新しい言語の機能が含まれるようになる。アーリーアダプターが可能な限り素早く個別の機能を利用できるようにするのが目的だ。
C# 7ではTupleが導入される予定だ。複数の値を返すメソッドが直接的に実現できる。
static (int sum, int count) Method()
{
return (0, 0)
}
// Calling the method and using the result
var result = Method();
Console.WriteLine($"Sum:{result.sum}.Count: {result.count}.");
Tupleはジェネリック型の内部でも使える。値型なのでヒープではなくスタックを使う。これによってGCのオーバヘッドを避けられるので、性能面で優位になる。
// async method returning a tuple
static async Task<(int sum, int count)> Method()
// Dictionary using a tuple as a key
var dict = new Dictionary<(string first, string last), person>();
パターンマッチングの機能のいくつかが削られるという話が憶測を呼びパターンマッチング自体が諦められたという噂があったが、C# 7ではパターンマッチングは導入される。そして、将来のバージョンで強化されていく予定だ。
C# 7以降
いくつかの機能が将来のC#の機能として、現在実装が進められている。パターンマッチングについては、簡潔な記述ができるような新しい構文が検討されている。
// Using C# 7 pattern matching
if (O is Point p && p.X == 5) { WriteLine($"Y: {p.Y}")}
// Same scenario with alternative syntax for future versions
if (o is Point X {var x, Y: var y} && x == 5) { WriteLine($"Y: {y}")}
if (o is Point { X : 5, Y: var y}) { WriteLine($"Y: {y}")}
if (o is Point(5, var y)) { WriteLine($"Y: {y}")}
Null許容型の実装も進んでいる。コンパイラが一貫性のないnull値の利用を検知したときに警告を上げる。
string? n;
string s;
n = null; // OK, nullable
s = null; // warning, shouldn't be null
s = n; // warning
WriteLine(s.Length); // Sure; it's not null
WriteLine(n.Length) // Warning! could be null
不変の値型であるレコード型も現在開発されている。不変性によって並列環境でも安全にデータを共有でき、プログラムも簡単に推論できる。レコード型によってC#で不変性を簡潔に実現できるようになる。レコードはデフォルトの値を持つので、ゲッターやGetHashCodeにそのまま使える。
Rate this Article
- Editor Review
- Chief Editor Action