C#7が準備するもの(パート1.タプル)

C#6とその新しいコンパイラーであるRoslynの公式リリースはまだありませんが、次のエディションであるC#7の詳細は既に知られています。 これはすべて暫定的なものですが、Microsoftが近い将来に私たちをどのように喜ばせるかはまだ興味深いです。







タプル



メソッドから複数の戻り値を頻繁に使用する場合は、通常、メソッドパラメーターでoutキーワードを使用するか、さまざまな追加の構造とクラスの定義を使用します。 それらは通常、メソッド定義のすぐ上にあります。変数の場合は、呼び出しの前にどこかで初期化する必要があります。 これはあまり便利ではありません。 したがって、どのような改善が期待されるのか、次のコードの例を検討します。



public (int sum, int count) Tally(IEnumerable<int> values) { ... } var t = Tally(myValues); Console.WriteLine($"Sum: {t.sum}, count: {t.count}");
      
      





ここに、パブリックフィールドを持つ匿名構造の定義があります。 つまり 複数の値の戻り値を使用するためのシンプルで非常に便利な方法を取得します。 内部で何が起こるかはまだ明確ではありません。 asyncのキープロパティを操作する例を次に示します。



 public async Task<(int sum, int count)> TallyAsync(IEnumerable<int> values) { ... } var t = await TallyAsync(myValues); Console.WriteLine($"Sum: {t.sum}, count: {t.count}");
      
      





この新しい構文では、匿名型を作成するための多くの興味深い可能性があります。



 var t = new (int sum, int count) { sum = 0, count = 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); //     }
      
      





リテラルを使用して匿名構造オブジェクトを作成する別の方法があります。



 public (int sum, int count) Tally(IEnumerable<int> values) { var res = (sum: 0, count: 0); //         foreach (var value in values) { res.sum += value; res.count++; } return res; }
      
      





この例は、JSONの作成に非常によく似ています。 そして、次のようなものを書くことができるかどうかは完全に明確ではありませんが:



 var res = (sum: 0, count: 0, option :( sum: 0, count: 0));
      
      





しかし、私には思われるように、最も「良い点」はコレクション内に匿名構造を作成することです。



 var list = List<(string name, int age)>(); list.Add("John Doe", 66); //         
      
      





今日の言語開発の開放性に満足しています。誰もが開発に影響を与え、アイデアを提供できます。 タプルの詳細はこちら



更新: ApeCoderユーザーに感謝します。 タプルを使用した変数の初期化のメカニズムが記事にないことを示しました。

以下に例を示します。

 public (int sum, int count) Tally(IEnumerable<int> values) { var res = (sum: 0, count: 0); // infer tuple type from names and values foreach (var value in values) { res.sum += value; res.count++; } return res; }
      
      





 (var sum, var count) = Tally(myValues); //   Console.WriteLine($"Sum: {sum}, count: {count}");
      
      






All Articles