English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

C# ValueTuple(値ツプレ)

C#7.0(.NET Framework 4.7)がValueTuple構造を導入しました。これはタプルの値型表現です。

ValueTupleは.NET Framework 4.7で利用可能です。プロジェクトにValueTupleが見当たらなければ、ValueTupleをインストールする必要があります。(.NET Framework 4.7またはより高いバージョン、または.NET Standard Library 2.0またはそれ以降のバージョンがValueTupleを含んでいます。)

ValueTupleパッケージをインストールするには、ソリューションエキスプローラーでプロジェクトを右クリックして、Manage NuGet Packages..をクリックします。これにより、NuGetパッケージマネージャーが開かれます。ブラウズタブ、検索ボックスでValueTupleを検索して、System.ValueTupleパッケージ、以下のように表示されます。

ValueTuple初期化

ValueTupleの作成と初期化は簡単です。括弧()を使用して値を指定して作成および初期化できます。

var person = (1, "Bill", "Gates");    
//等価なタプル
//var person = Tuple.Create(1「 Bill」,「 Gates」);"Bill", "Gates");

各要素の型を指定してValueTupleを初期化することもできます。以下のように示されます。

ValueTuple<int, string, string> person = (1, "Bill", "Gates");
person.Item1;  // 返します1
person.Item2;   // 「Bill」を返します
person.Item3;   // 「Gates」を返します

各メンバーの型を宣言する簡略化方法があります。

(int, string, string) person = (1, "Bill", "Gates");
person.Item1;  // 返します1
person.Item2;   // 「Bill」を返します
person.Item3;   // 「Gates」を返します

上記のtuple初期化文ではvarを使用していないことに注意してください。代わりに、括弧の中で各メンバーの値の型を提供しています。

タプルは少なくとも2つの値が必要です。以下はタプルではありません:

var number = (1);  // int型、タプルではありません
var numbers = (1,2); // 有効なタプル

Tupleとは異なり、ValueTupleは8個以上の値を含むことができます。

var numbers = (1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14);

メンバー命名

ValueTupleの属性には、デフォルトの属性名(例えばItem)ではなく、名前を割り当てることができます。1,Item2などです。

(int Id, string FirstName, string LastName) person = (1, "Bill", "Gates");
person.Id;   // 返します1
person.FirstName;  // 「Bill」を返します
person.LastName; // 「Gates」を返します

また、右側でメンバー名に値を割り当てることができます。以下のように示されます。

var person = (Id:1, FirstName:"Bill", LastName: "Gates");

左側または右側でメンバー名を提供できますが、両側で提供することはできません。左側が優先されます。以下の内容では右側の名前を無視します。

// PersonId、FName、LNameは無視されます。
(int Id, string FirstName, string LastName) person = (PersonId:1, FName:"Bill", LName: "Gates");
//PersonId、FirstName、LastNameは無視されます。デフォルトの名前はItemです:1,Item2,Item3。
(string, string, int) person = (PersonId:1, FName:"Bill", LName: "Gates");

変数をメンバー値として割り当てることもできます。

string firstName = "Bill", lastName = "Gates";
var per = (FirstName: firstName, LastName: lastName);

ValueTupleを返却型として使用

以下のメソッドはValueTupleを返します。

static void Main(string[] args)
{
    DisplayTuple(1, "Bill", "Gates");
}
static void DisplayTuple((int, string, string) person)
{
    Console.WriteLine($"Id = { person.Item1});
    Console.WriteLine($"First Name = { person.Item2});
    Console.WriteLine($"Last Name = { person.Item3});
}

メソッドから返されるValueTupleに対して、異なるメンバー名を指定することもできます。

static void Main(string[] args)
{    var person = GetPerson();
}
static (int, string, string) GetPerson()}} 
{    return (Id:1, FirstName: "Bill", LastName: "Gates");
}

解构

ValueTupleを解构することで、その各メンバーを検索できます。解构宣言文法は、ValueTupleを複数の部分に分割し、それぞれを新しい変数に割り当てます。

static void Main(string[] args)
{  
    // 属性名の変更
    (int PersonId, string FName, string LName) = GetPerson();
}
static (int, string, string) GetPerson()}} 
{    return (Id:1, FirstName: "Bill", LastName: "Gates");
}

varを使って明示的なデータ型名を代わりに使用することもできます。

static void Main(string[] args)
{    
    // 使用var作データ型
    (var PersonId, var FName, var LName) person = GetPerson();
}
static (int, string, string) GetPerson()}} 
{ 
   return (Id:1, FirstName: "Bill", LastName: "Gates");
}

ValueTuple は、使用しないメンバーに対して「捨てる」構文を許可します。

// 未使用のメンバー LName には下線 _ を使用して捨てます。
(var id, var FName, _) = GetPerson();