C#では、タプルはデータを整理するデータ構造で、任意の型のフィールドを2つ以上まとめて保持します。
タプルは通常、2つ以上の式をコンマで区切って括弧で囲むことで作成します。
string boast = "All you need to know";
bool success = !string.IsNullOrWhiteSpace(boast);
(bool, int, string) triple = (success, 42, boast);
タプルは、代入や初期化の操作で使えるほか、戻り値やメソッドの引数としても使えます。
フィールドはドット記法で取り出します。既定では、最初のフィールドがItem1、2番目がItem2、というようになります。既定以外の名前については後述します。
// initialization
(int, int, int) vertices = (90, 45, 45);
// assignment
vertices = (60, 60, 60);
// return value
(bool, int) GetSameOrBigger(int num1, int num2)
{
return (num1 == num2, num1 > num2 ? num1 : num2);
}
// method argument
int Add((int, int) operands)
{
return operands.Item1 + operands.Item2;
}
Item1のようなフィールド名では、読みやすいコードにはなりません。以下のコードでは、タプルのフィールドに名前を付ける2つの方法を示します。また、以下のコードでは、varをタプルで使って型を推論できることにも注目してください。これは、名前付きフィールドを持つタプルでも、名前のないフィールドを持つタプルでも、同じように機能します。
// name items in declaration
(bool success, string message) results = (true, "well done!");
bool mySuccess = results.success;
string myMessage = results.message;
// name items in creating expression
var results2 = (success: true, message: "well done!");
bool mySuccess2 = results2.success;
string myMessage2 = results2.message;
この演習では、電話番号を分析します。
実装する機能は2つあります。
ルーチンに渡される電話番号は、必ずNNN-NNN-NNNNの形式(たとえば212-515-9876)であり、nullになることはありません。
分析では、3つのデータを返します。
(静的)メソッドPhoneNumber.Analyze()を実装して、電話番号の情報を生成します。
PhoneNumber.Analyze("631-555-1234");
// => (false, true, "1234")
タスク1で生成した電話番号の情報を使って、その電話番号が偽のものかどうかを検出する(静的)メソッドPhoneNumber.IsFake()を実装します。
PhoneNumber.IsFake(PhoneNumbers.Analyze("631-555-1234"));
// => true