4.7で追加されたValueTuple構造体とタプル構文を使うと、複数のオブジェクトをひとまとめにしてメソッドの返値などで使える。専用のクラスや構造体を定義するほどのことでもないが、複数のオブジェクトを一時的に1つにまとめたいときがある。代表的な場面は、メソッドの返値だ。メソッドは1つのオブジェクトしか返せない。これまでは複数の結果を返そうと思ったら、複数の結果を格納するためだけに型を定義したり、あるいは、out引数(C#)/ByRef引数(VB)を使ったりしていた。15)で導入されたタプル構文を使えば、簡単に複数の結果を一時的に1つにまとめられるのだ。それらの新しい機能のうち、本稿ではメソッドから複数の結果を返して使う方法について解説する。タプル構文の使い方タプル構文の使い方まとめ特定のトピックをすぐに知りたいという方は以下のリンクを活用してほしい。2017以降が必要である。サンプルコードはコンソールアプリの一部であり、コードの冒頭に以下の宣言が必要となる。4.7で導入された*1。これら2つはよく似ており、例えば2つの値をまとめて返すメソッドを次のコードのように記述できる。FunctionTupleとValueTupleの例(上:C#、下:VB)このようなコーディングでは、TupleクラスとValueTuple構造体は同じように見える。ValueTuple構造体は、以降で解説するタプル構文で利用することで、その威力を発揮する。どちらもインスタンスを作ってから初期化してもよいが、このようにCreate静的メソッドを使った方が簡潔に書ける。似ているTupleクラスとValueTuple構造体だが、以下のような違いがある。ValueTupleは軽量ValueTupleは構造体なので、クラスであるTupleよりも生成にかかるコストが小さく軽量である。15)では、ValueTuple構造体を使ったタプル構文が導入された。タプル構文を使うと、複数のオブジェクトを1つにまとめたり分解したりするコードをシンプルに書ける。タプルに格納する個々の要素に名前(以降、タプル名)を付けることもできる(ValueTuple構造体を直接使った場合はタプル名を付けられない)。以降では、タプル構文による書き方を解説していく。4.7以前でも、NuGetからSystem.ValueTupleパッケージをプロジェクトに導入すれば、ValueTuple構造体を利用できる。複数の値をまとめてメソッドから返すには?前述したValueTuple構造体を返すメソッドは、タプル構文を使うと簡潔に書ける(次のコード)。int)」(C#)となる。x)」と書くだけでよいのだ。Functionタプル構文でタプル名を付けずに2つの値を返す例(上:C#、下:VB)上のように記述した場合、返値を受け取った側では、タプル内の要素をItem1/Item2という既定の名前で参照することになる。次のコードのようにしてタプル名を付けると、返値を受け取った側ではタプル内の要素をタプル名で参照できる。タプル名はTupleElementNames属性(System.Runtime.CompilerServices名前空間)によって実現されているのだが、この属性を直接コーディングすることはできない(タプル構文が強制される)。Functionタプル構文でタプル名を付けて2つの値を返す例(上:C#、下:VB)上のように記述した場合、返値を受け取った側では、タプル内の要素をx1/y1というタプル名で参照することになる(後述)。適切なタプル名を付けておくことで、コードの見通しがよくなる。複数の値をメソッドから受け取るには?ValueTuple構造体を返してくるメソッドの基本的な呼び出し方は、次のコードのようになる。result2a.y1=22つの値を返すメソッドを呼び出す例(上:C#、下:VB)呼び出しているメソッドExchange1/Exchange2は、前述のもの。既定の名前(Item1/Item2......)しか持っていないタプルなのか、名前付きタプルなのか、コーディング時に迷うことはない。StudioのIntelliSenseが提示してくれる。受け取るときに別のタプル名を付けることもできる(次のコード)。result2b.N=22つの値を返すメソッドを呼び出すときにタプル構文を使って別のタプル名を付ける例(上:C#、下:VB)呼び出しているメソッドExchange1/Exchange2は、前述のもの。メソッドから返ってくるタプルにタプル名が付いていようといまいと、別のタプル名を付けたタプルとして受け取ることができる。7では、タプルを受け取るときにいきなり分解する(タプルの要素を個別の変数に代入する)ことも可能だ(次のコード)。受け取ったタプルをそのまま利用することがないのであれば、このように簡潔に書ける。q=2受け取ったタプルをいきなり分解するタプル構文の例(C#のみ)呼び出しているメソッドExchange1は前述。_)」のようにして、タプルとして返された値で使わない要素を「_」で示すこともできる(「_」は書き込み専用の変数)。将来のバージョンでサポートされるものと期待される。15で導入されたタプル構文では、複数の変数やリテラルをカンマで区切って並べて丸かっこで囲むだけでタプルになる。タプルの各要素には(従来のTupleクラスとは異なり)タプル名を付けられる。タプルを受け取った側では、従来のTupleクラスと同様にItem1/Item2......という名前でもアクセスできるし、タプル名が付けられていればそれでもアクセスできる。受け取るときに異なるタプル名を付けてもよい。7では、タプルを受け取ると同時に分解することもできる。4.7で導入されたValueTuple構造体を利用している。Frameworkでも、NuGetから導入すれば利用可能だ。メールマガジンをご購読ください。申し込みページへITmediaはアイティメディア株式会社の登録商標です。