📢 Webサイト閉鎖と移転のお知らせ
このWebサイトは2026年9月に閉鎖いたします。
新しい記事は移転先で追加しております。(旧サイトでは記事を追加しておりません)

30行目: 30行目:
|}
|}
</center>
</center>
<br>
==== 名前付け ====
<code>ValueTuple</code>構造体と匿名型は、メンバに名前を付けることができる。<br>
ただし、匿名型と異なり、<code>ValueTuple</code>構造体は初期化時の変数名等から名前を割り当てることはできない。<br>
<syntaxhighlight lang="c#">
var hoge = 1;
var piyo = "yy";
// ValueTuple構造体
var vt1 = (x:1, y:"vt");
var vt2 = (x:hoge, y:piyo);
(int x, string y) vt3 = (1, "ccc");  //  明示的に、名前付きのValueTuple構造体として宣言できる
// 匿名型
var a1 = new {x = 1, y = "a"};
var a2 = new {hoge, piyo};
</syntaxhighlight>
<br>
==== 引数・戻値 ====
<code>Tuple</code>クラスと同様、<code>ValueTuple</code>構造体も引数・戻値として指定できる。<br>
<syntaxhighlight lang="c#">
// 引数・戻り値にTupleクラスを指定する
public Tuple<int, string> GetTuple(Tuple<int, string> t) => t;
// 引数・戻り値にValueTuple構造体を指定する
public (int, string) GetValueTuple1((int, string) vt) => vt;
// 引数・戻り値に名前付きValueTuple構造体を指定する
public (int x, string y) GetValueTuple2((int a, string b) vt) => vt;
</syntaxhighlight>
<br>
==== 型の種類 ====
<code>Tuple</code>クラスは、null許容であるため、<code>null</code>で初期化できる。<br>
<code>ValueTuple</code>構造体は、null非許容の値型であるため、<code>null</code>で初期化できない。<br>
<syntaxhighlight lang="c#">
// null非許容の値型であるため、nullを '(int, string)' に変換できません
(int, string) vt = null;
// Tupleクラスは、nullで初期化できる
Tuple<int, string> t = null;
</syntaxhighlight>
<br>
==== メンバの種類 ====
<code>ValueTuple</code>構造体のメンバはフィールドであるため、以下の2つの特徴がある。<br>
* out / refキーワードの引数に渡すことができる。
* プロパティを前提としたFWでは使用できない。(例. バインディング等)
<syntaxhighlight lang="c#">
var vt = (1, "a");
Add(ref vt.Item1);
var t = Tuple.Create(1, "a");
// Add(ref t.Item1);  // プロパティまたはインデクサをout / refキーワードの引数に渡すことはできない
</syntaxhighlight>
<br>
==== 不変性 ====
<code>Tuple</code>クラスのプロパティは、イミュータブル(不変)である。<br>
<code>ValueTuple</code>構造体のメンバはフィールドであるため、ミュータブルである。<br>
<syntaxhighlight lang="c#">
// 割り当て可能
var vt = (1, "a");
vt.Item1 = 2;
// Tuple<int, string>.Item1(プロパティまたはインデクサ)は読み取り専用であるため、割り当てることはできない
var t = Tuple.Create(1, "a");
// t.Item1 = 2;
// <anonymous type: int Item1, string Item2>.Item1(プロパティまたはインデクサ)は読み取り専用であるため、割り当てることはできない
var a = new { Item1 = 1, Item2 = "a" };
// a.Item1 = 2;
</syntaxhighlight>
<br>
なお、<code>ValueTuple</code>構造体のフィールドはミュータブルであるが値型でもあるため、以下のように記述できない。<br>
<syntaxhighlight lang="c#">
(int i, string s)[] arr = { (1, "a"), (2, "b"), (3, "c"), (4, "d")};
foreach(var tuple in arr)
{
    // tuple.i = 2;  // コンパイルエラー
                    // ValueTuple構造体のフィールドは、foreach文の繰り返し変数であるため変更できない
}
</syntaxhighlight>
<br><br>
<br><br>