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

 
(同じ利用者による、間の2版が非表示)
131行目: 131行目:


== 複数の値をまとめてメソッドから返す ==
== 複数の値をまとめてメソッドから返す ==
前述したValueTuple構造体を返すメソッドは、タプル構文を使うと次のように簡潔に書ける。<br>
<code>ValueTuple</code>構造体を返すメソッドは、タプル構文を使用することで簡潔に記述できる。<br>
ValueTuple<int, int>という型の宣言は、タプル構文では(int, int)と同義である。<br>
<br>
タプルを生成するValueTuple.Create(y, x)式は、タプル構文では(y, x)と書くだけでよい。<br>
例えば、ValueTuple<int, int>型は、タプル構文では(int, int)と同義である。<br>
  <source lang="c#">
また、タプルを生成するValueTuple.Create(y, x)は、タプル構文では(y, x)と記述するだけでよい。<br>
タプル構文でタプル名を付けずに2つの値を返す例
<br>
  // ValueTuple構造体を直接使う書き方(前述)
以下の例では、タプル構文でタプル名を付けずに2つの値を返している。<br>
以下のように記述する場合、戻り値を受け取る側では、タプル内の要素を<code>Item1</code>および<code>Item2</code>という既定の名前で参照できる。<br>
  <syntaxhighlight lang="c#">
  // ValueTuple構造体を直接記述する
  static ValueTuple<int, int> NewExchange1(int x, int y) => ValueTuple.Create(y, x);
  static ValueTuple<int, int> NewExchange1(int x, int y) => ValueTuple.Create(y, x);
   
   
  // タプル構文を使って上と同義のコードを書く
  // 上と同義の処理を、タプル構文を使用して記述する
  static (int, int) NewExchange1(int x, int y) => (y, x);
  static (int, int) NewExchange1(int x, int y) => (y, x);
  </source>
  </syntaxhighlight>
上のように記述した場合、戻り値を受け取った側では、タプル内の要素をItem1 / Item2という既定の名前で参照できる。<br>
<br>
以下のように、タプル名を付けることにより、戻り値を受け取る側ではタプル内の要素をタプル名で参照できる。<br>
<br>
<br>
次のコードのようにしてタプル名を付けると、戻り値を受け取った側ではタプル内の要素をタプル名で参照できる。<br>
なお、タプル名は<code>TupleElementNames</code>属性(<code>System.Runtime.CompilerServices</code>名前空間)により実現されているが、<br>
なお、タプル名はTupleElementNames属性(System.Runtime.CompilerServices名前空間)によって実現されているが、<br>
この属性を直接コーディングすることはできない。(タプル構文が強制される)<br>
この属性を直接コーディングすることはできない。(タプル構文が強制される)<br>
  <source lang="c#">
<br>
タプル構文でタプル名を付けて2つの値を返す例
以下の例では、 タプル構文でタプル名を付けて2つの値を返している。<br>
戻り値を受け取る側では、タプル内の要素をxおよびyというタプル名で参照できる。<br>
  <syntaxhighlight lang="c#">
  static (int x, int y) NewExchange2(int x, int y) => (y, x);
  static (int x, int y) NewExchange2(int x, int y) => (y, x);
  </source>
  </syntaxhighlight>
上のように記述した場合、戻り値を受け取った側では、タプル内の要素をx / yというタプル名で参照できる。<br>
<br>
適切なタプル名を付けておくことで、可読性が良くなる。<br>
適切なタプル名を付けておくことで、可読性が良くなる。<br>
<br><br>
<br><br>


== 複数の値をメソッドから受け取る ==
== 複数の値をメソッドから受け取る ==
ValueTuple構造体を返すメソッドの基本的な呼び出し方は、次のコードのようになる。<br>
<code>ValueTuple</code>構造体を返すメソッドの基本的な使用方法は、以下のように記述する。<br>
  <source lang="c#">
  <syntaxhighlight lang="c#">
  // タプル名なし(既定の名前Item1 / Item2等でアクセスする)
  // タプル名なし(既定の名前Item1 / Item2等でアクセスする)
  var tResult1 = NewExchange1(2, 3);
  var tResult1 = NewExchange1(2, 3);
165行目: 170行目:
  var tResult2 = NewExchange2(2, 3);
  var tResult2 = NewExchange2(2, 3);
  WriteLine($"tResult2.x={tResult2.x}, tResult2.y={tResult2.y}");
  WriteLine($"tResult2.x={tResult2.x}, tResult2.y={tResult2.y}");
  </source>
  </syntaxhighlight>
あるいは、次のコードのように、受け取るときに別のタプル名を付けることもできる。<br>
<br>
  <source lang="c++">
また、以下のように、受け取る時に別のタプル名を付けることもできる。<br>
  <syntaxhighlight lang="c#">
  // タプル名なしで返すメソッド
  // タプル名なしで返すメソッド
  (int X, int Y) tResult1 = NewExchange1(2, 3);
  (int X, int Y) tResult1 = NewExchange1(2, 3);
  WriteLine($"tResult1.X={tResult1.X}, tResult1.Y={tResult1.Y}");
  WriteLine($"tResult1.X={tResult1.X}, tResult1.Y={tResult1.Y}");
   
   
  // タプル名付きで返してくるメソッド
  // タプル名付きで返すメソッド
  (int M, int N) tResult2 = NewExchange2(2, 3);
  (int M, int N) tResult2 = NewExchange2(2, 3);
  WriteLine($"tResult1.X={tResult1.M}, tResult1.Y={tResult1.N}");
  WriteLine($"tResult1.X={tResult1.M}, tResult1.Y={tResult1.N}");
  </source>
  </syntaxhighlight>
<br>
<br>
更に、C# 7では、タプルを受け取るときにいきなり分解することも可能である。(タプルの要素を個別の変数に代入する)<br>
C# 7以降では、タプルを受け取る時に分解することも可能である。(タプルの要素を個別の変数に代入する)<br>
  <source lang="c#">
  <syntaxhighlight lang="c#">
  var (p, q) = NewExchange1(2, 3);
  var (p, q) = NewExchange1(2, 3);
  WriteLine($"p={p}, q={q}");
  WriteLine($"p={p}, q={q}");
  </source>
  </syntaxhighlight>
<br>
<br>
また、(p, _)のようにして、タプルとして返された値で使わない要素を「_」で示すこともできる。(「_」は書き込み専用の変数)<br>
また、(p, _)のようにして、タプルとして返された値で使用しない要素を<code>_</code>で削除することもできる。(<code>_</code>は書き込み専用の変数)<br>
  <source lang="c#">
  <syntaxhighlight lang="c#">
  var (p, _) = NewExchange1(2, 3);
  var (p, _) = NewExchange1(2, 3);
  WriteLine($"p={p}");
  WriteLine($"p={p}");
  </source>
  </syntaxhighlight>
<br><br>
<br><br>


__FORCETOC__
__FORCETOC__
[[カテゴリ:C_Sharp]]
[[カテゴリ:C_Sharp]]