![見出し画像](https://assets.st-note.com/production/uploads/images/112771718/rectangle_large_type_2_0f97f9d17ba6297e2b9ac53152631ca3.png?width=800)
Photo by
エドガー・ドガ / メトロポリタン美術館
C# メモ:System.TupleとSystem.ValueTupleの違いについて
どっちを使えばいいのか
特に理由(C#のバージョンが古いものしか使えない等)がなければSystem.ValueTupleを使う。
System.TupleとSystem.ValueTupleの違い
① 型
System.Tuple ⇒ クラス(参照型)
System.ValueTuple ⇒ 構造体(値型)
(この点でパフォーマンスはValueTupleの方が良い)
② 宣言
System.Tupleの場合:
以下の方法で宣言する。ValueTupleのように簡略化した宣言方法はない。
Tuple<int, string> myTuple = new Tuple<int, string>(1, "One");
System.ValueTupleの場合:
ValueTupleの型を明示的に書く必要はなく、簡略化して宣言できる。
(int, string) myValueTuple = (23, "Jhon");
名前をつけて宣言することも可能
(int Age, string Name) myValueTuple = (23, "Jhon");
型を明示的に書いて宣言することも可能
ValueTuple<int, string> myValueTuple = new ValueTuple<int, string>(23, "Jhon");
※ ただし、この場合は名前付きにすることが出来ない。
③ 要素へのアクセス方法
System.Tupleの場合:
// (Item1, Item2)
myTuple.Item1;
myTuple.Item2;
System.ValueTupleの場合:
// 名前付きで宣言していない場合
myValueTuple.Item1;
myValueTuple.Item2;
// 名前付きで宣言している場合
myValueTuple.Age;
myValueTuple.Name;
④ 可変性
System.Tupleは一度作成すると値を後から変更できない(イミュータブル)。
System.ValueTupleは後から値を変更することができる(ミュータブル)。
⑤ 互換性
System.Tuple ⇒ .NET Framework 4.0、C#4.0以降で使用可能
System.ValueTuple ⇒ .NET Framework 4.7、C#7.0以降で使用可能
その他
・ValueTupleの名前付きフィールドの制限
名前付きフィールドはローカルスコープでのみ有効。
void Method1()
{
(int Number, string Name) myValueTuple = (1, "One");
Method2(myValueTuple);
}
void Method2((int, string) myValueTuple)
{
// 以下の様にはできない
//myValueTuple.Number;
//myValueTuple.Name;
// 以下は可能
myValueTuple.Item1;
myValueTuple.Item2;
}
・ValueTupleを読み取り専用にする
readonly修飾子を使用することで可能。
参考
・公式
・タプルについて
・C#と.NET Frameworkの対応表
この記事が気に入ったらサポートをしてみませんか?