見出し画像

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の対応表



この記事が気に入ったらサポートをしてみませんか?