逆コンパイルされた C# 7 ライブラリでは、Tuple の代わりに ValueTuple ジェネリックが使用される場合があります。これら 2 つの型の違いを理解することが重要です。
主な違い:
パフォーマンスに関する考慮事項:
ValueTuple の設計では、スタック割り当てを利用することでパフォーマンスを優先し、参照型によって発生するオーバーヘッドを回避します。また、タプルの最適化された等価性セマンティクスも提供します。
構文シュガー:
C# 7 では、ValueTuple にシュガー構文が導入され、名前付き引数 (例: (sum, count) = DoStuff()) とコードの簡素化
例:
次の例を考えてみましょう:
public (int sum, int count) DoStuff(IEnumerable<int> values) { var sum = 0; var count = 0; foreach (var value in values) { sum += value; count++; } return (sum, count); // ValueTuple }
分解時:
var (sum, count) = DoStuff(Enumerable.Range(0, 10)); Console.WriteLine($"Sum: {sum}, Count: {count}");
コンパイラ実装:
内部的に、コンパイラは TupleElementNamesAttribute などの属性を利用して名前付き引数を解釈し、効率的なコードを生成します。
結論:
ValueTuple が提供するもの値型であることと、最適化された等価セマンティクスを提供することにより、パフォーマンス上の利点が得られます。分解のための構文シュガーにより、コードの可読性と使いやすさが向上します。ただし、特にクラス内から参照する場合は、その可変性を考慮して値を慎重に割り当てることが重要です。
以上がC# の ValueTuple とタプル: 主な違いは何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。