'params' キーワード
CoddyのC#ジャーニー「オブジェクト指向プログラミング」セクションの一部 — レッスン 47/70。
paramsキーワードを使用すると、メソッドが同じ型の可変個の引数を受け取れるようになります。呼び出し側に配列を手動で作成することを要求する代わりに、引数をカンマで区切って直接渡すことができます。
メソッドシグネチャ内の配列パラメータの前に params を配置します:
public static int Sum(params int[] numbers)
{
int total = 0;
foreach (int n in numbers)
total += n;
return total;
}
// これらの呼び出しはすべて動作します
Console.WriteLine(Sum(1, 2)); // 3
Console.WriteLine(Sum(1, 2, 3, 4, 5)); // 15
Console.WriteLine(Sum()); // 0 (空の配列)コンパイラは引数を自動的に配列にラップします。すでに配列がある場合は、既存の配列を直接渡すこともできます。
int[] values = { 10, 20, 30 };
Console.WriteLine(Sum(values)); // 60覚えておくべきルールがいくつかあります:メソッドは params パラメータを1つだけ持つことができ、リストの最後のパラメータである必要があります。通常のパラメータと組み合わせることもできます:
public static void Log(string prefix, params object[] items)
{
foreach (var item in items)
Console.WriteLine(prefix + item);
}
Log("Item: ", "Apple", 42, true);params キーワードは、APIをより柔軟で呼び出し側に優しいものにします。そのため、Console.WriteLine や string.Format のようなメソッドでこのキーワードが使われています。
チャレンジ
簡単任意の数の値を処理するために params キーワードを使用する、柔軟なメッセージフォーマッタを構築しましょう。可変引数を持つメッセージをフォーマットできるユーティリティクラスを作成し、params がメソッドをいかに多用途で呼び出しやすくするかを実証します。
コードは2つのファイルに分けて構成します:
MessageFormatter.cs:Formatting名前空間内にMessageFormatterクラスを作成し、paramsを使用する2つのメソッドを実装します:Combine(params string[] parts)- 提供されたすべての文字列をスペースで結合し、その結果を返します。FormatList(string label, params int[] numbers)- 通常のパラメータとparams配列を組み合わせます。ラベルの後にコロンを付け、その後にカンマで区切られたすべての数値を返す必要があります(例:Scores: 85, 90, 78)。
Program.cs: メインファイルで、入力を使用して両方のメソッドを実証します。ラベル文字列を読み取り、次にカンマ区切りの整数の行を読み取ります。Combineを使用して3つの固定された単語を結合し、FormatListを使用してラベルと数値を表示します。
2つの入力を受け取ります:
- ラベル文字列(例:
Scores) - カンマ区切りの整数のリスト(例:
85,90,78,92)
まず、"Hello"、"params"、"world!" という単語を指定して Combine を呼び出し、結果を出力します。次に、カンマ区切りの整数を配列にパースし、ラベルと整数配列を指定して FormatList を呼び出し、その結果も出力します。
例えば、入力が Scores と 85,90,78 の場合、出力は以下のようになります:
Hello params world!
Scores: 85, 90, 78Combine が任意の数の文字列を直接受け入れるのに対し、FormatList は通常のパラメータと params を混在させることができることを示しています(params パラメータは最後に配置する必要があります)。また、既存の配列を params メソッドに渡すこともできます。これは、パースされた整数に対してまさに行うことです!
チートシート
params キーワードを使用すると、呼び出し側が手動で配列を作成することなく、メソッドが同じ型の可変個の引数を受け取ることができるようになります。
public static int Sum(params int[] numbers)
{
int total = 0;
foreach (int n in numbers)
total += n;
return total;
}
// これらの呼び出しはすべて機能します
Console.WriteLine(Sum(1, 2)); // 3
Console.WriteLine(Sum(1, 2, 3, 4, 5)); // 15
Console.WriteLine(Sum()); // 0 (空の配列)既存の配列を params メソッドに直接渡すこともできます。
int[] values = { 10, 20, 30 };
Console.WriteLine(Sum(values)); // 60params のルール:
- メソッドは
paramsパラメータを1つだけ持つことができます - リストの最後のパラメータである必要があります
- 通常のパラメータと組み合わせることができます
public static void Log(string prefix, params object[] items)
{
foreach (var item in items)
Console.WriteLine(prefix + item);
}
Log("Item: ", "Apple", 42, true);自分で試してみよう
using System;
using Formatting;
class Program
{
public static void Main(string[] args)
{
// 入力を読み込む
string label = Console.ReadLine();
string numbersInput = Console.ReadLine();
// TODO: MessageFormatter.Combine を "Hello"、"params"、および "world!" と共に使用する
// そして結果を出力する
// TODO: カンマ区切りの整数を int 配列にパースする
// ヒント: 文字列を分割し、各部分を int に変換する
// TODO: MessageFormatter.FormatList を label と int 配列と共に使用する
// そして結果を出力する
}
}
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。