[C#] 受け取った可変長引数の配列の使い方を解説
C#では、可変長引数を受け取るにはメソッドの引数にparams
キーワードを使用します。
params
を使うことで、呼び出し側は複数の引数を渡すことができ、それらはメソッド内で配列として扱われます。
例えば、params int[] numbers
と指定すると、メソッド内でnumbers
はint型
の配列として利用できます。
可変長引数は0個でも渡すことが可能で、配列のようにループやインデックスでアクセスできます。
可変長引数の配列の使い方
C#では、可変長引数を使用することで、メソッドに渡す引数の数を柔軟に扱うことができます。
ここでは、可変長引数の配列の使い方について詳しく解説します。
配列としてのアクセス方法
可変長引数は、メソッド内で配列として扱われます。
以下のサンプルコードでは、可変長引数を受け取るメソッドを定義し、その引数にアクセスする方法を示します。
using System;
class Program
{
static void Main(string[] args)
{
PrintNumbers(1, 2, 3, 4, 5); // 可変長引数を渡す
}
static void PrintNumbers(params int[] numbers) // 可変長引数の定義
{
foreach (int number in numbers) // 配列としてアクセス
{
Console.WriteLine(number); // 各要素を出力
}
}
}
1
2
3
4
5
ループを使った可変長引数の処理
可変長引数をループで処理することで、引数の数に関係なく同じ処理を行うことができます。
以下の例では、可変長引数を受け取り、その合計を計算します。
using System;
class Program
{
static void Main(string[] args)
{
int sum = CalculateSum(1, 2, 3, 4, 5); // 可変長引数を渡す
Console.WriteLine($"合計: {sum}"); // 合計を出力
}
static int CalculateSum(params int[] numbers) // 可変長引数の定義
{
int sum = 0; // 合計を初期化
foreach (int number in numbers) // 配列としてループ処理
{
sum += number; // 各要素を合計
}
return sum; // 合計を返す
}
}
合計: 15
インデックスを使った要素の取得
可変長引数は配列として扱われるため、インデックスを使って特定の要素にアクセスすることができます。
以下の例では、特定のインデックスの要素を取得して出力します。
using System;
class Program
{
static void Main(string[] args)
{
string result = GetElement(0, "Apple", "Banana", "Cherry"); // 可変長引数を渡す
Console.WriteLine(result); // 要素を出力
}
static string GetElement(int index, params string[] fruits) // 可変長引数の定義
{
if (index < fruits.Length) // インデックスが範囲内か確認
{
return fruits[index]; // 指定したインデックスの要素を返す
}
return "インデックスが範囲外です"; // 範囲外の場合のメッセージ
}
}
Apple
配列の長さを取得する方法
可変長引数の配列の長さは、Length
プロパティを使用して取得できます。
以下の例では、可変長引数の要素数を出力します。
using System;
class Program
{
static void Main(string[] args)
{
int count = GetCount(1, 2, 3, 4, 5); // 可変長引数を渡す
Console.WriteLine($"要素数: {count}"); // 要素数を出力
}
static int GetCount(params int[] numbers) // 可変長引数の定義
{
return numbers.Length; // 配列の長さを返す
}
}
要素数: 5
可変長引数と他の引数の組み合わせ
可変長引数は、他の引数と組み合わせて使用することができます。
これにより、より柔軟なメソッドを作成することが可能です。
以下では、可変長引数と他の引数の組み合わせについて解説します。
可変長引数と通常の引数の併用
可変長引数は、通常の引数と併用することができます。
通常の引数を先に指定し、その後に可変長引数を指定することで、特定の引数を必須にしつつ、追加の引数を柔軟に受け取ることができます。
以下の例では、名前と年齢を受け取り、任意の趣味を可変長引数として受け取ります。
using System;
class Program
{
static void Main(string[] args)
{
Introduce("山田太郎", 30, "読書", "映画鑑賞", "旅行"); // 通常の引数と可変長引数を渡す
}
static void Introduce(string name, int age, params string[] hobbies) // 通常の引数と可変長引数の定義
{
Console.WriteLine($"名前: {name}, 年齢: {age}"); // 名前と年齢を出力
Console.WriteLine("趣味: " + string.Join(", ", hobbies)); // 趣味を出力
}
}
名前: 山田太郎, 年齢: 30
趣味: 読書, 映画鑑賞, 旅行
可変長引数を最後に指定する理由
C#では、可変長引数はメソッドの引数リストの最後に指定する必要があります。
これは、コンパイラが引数の数を正しく判断するためです。
可変長引数が最後にあることで、他の引数との区別が明確になります。
以下の例では、可変長引数を最後に指定しています。
using System;
class Program
{
static void Main(string[] args)
{
DisplayInfo("佐藤花子", 25, "音楽", "スポーツ"); // 通常の引数と可変長引数を渡す
}
static void DisplayInfo(string name, int age, params string[] interests) // 可変長引数を最後に指定
{
Console.WriteLine($"名前: {name}, 年齢: {age}"); // 名前と年齢を出力
Console.WriteLine("興味: " + string.Join(", ", interests)); // 興味を出力
}
}
名前: 佐藤花子, 年齢: 25
興味: 音楽, スポーツ
デフォルト引数と可変長引数の組み合わせ
デフォルト引数と可変長引数を組み合わせることで、さらに柔軟なメソッドを作成できます。
デフォルト引数を使用することで、引数を省略した場合の値を設定できます。
以下の例では、デフォルトの年齢を設定し、趣味を可変長引数として受け取ります。
using System;
class Program
{
static void Main(string[] args)
{
Introduce("田中一郎"); // 年齢を省略
Introduce("田中一郎", 28, "サッカー", "料理"); // 年齢と趣味を指定
}
static void Introduce(string name, int age = 20, params string[] hobbies) // デフォルト引数と可変長引数の定義
{
Console.WriteLine($"名前: {name}, 年齢: {age}"); // 名前と年齢を出力
Console.WriteLine("趣味: " + string.Join(", ", hobbies)); // 趣味を出力
}
}
名前: 田中一郎, 年齢: 20
趣味:
名前: 田中一郎, 年齢: 28
趣味: サッカー, 料理
このように、可変長引数と他の引数を組み合わせることで、より多様なメソッドを作成することができます。
可変長引数の制約と注意点
可変長引数は非常に便利ですが、いくつかの制約や注意点があります。
これらを理解しておくことで、より効果的に可変長引数を活用できます。
以下では、可変長引数の制約と注意点について解説します。
可変長引数は1つしか指定できない
C#では、メソッドに可変長引数を指定する場合、1つのメソッドに対して可変長引数は1つしか指定できません。
これは、引数の解釈を明確にするためです。
以下の例では、可変長引数を1つだけ指定しています。
using System;
class Program
{
static void Main(string[] args)
{
PrintNames("山田", "佐藤", "鈴木"); // 可変長引数を渡す
}
static void PrintNames(params string[] names) // 可変長引数の定義
{
foreach (string name in names) // 配列としてループ処理
{
Console.WriteLine(name); // 各名前を出力
}
}
}
山田
佐藤
鈴木
可変長引数の型は統一される
可変長引数は、同じ型の引数を受け取る必要があります。
異なる型の引数を混在させることはできません。
以下の例では、整数型の可変長引数を定義していますが、文字列型を渡すとコンパイルエラーになります。
using System;
class Program
{
static void Main(string[] args)
{
// PrintNumbers(1, 2, "三"); // コンパイルエラー: 型が一致しない
PrintNumbers(1, 2, 3); // 正常な呼び出し
}
static void PrintNumbers(params int[] numbers) // 可変長引数の定義
{
foreach (int number in numbers) // 配列としてループ処理
{
Console.WriteLine(number); // 各数値を出力
}
}
}
1
2
3
オーバーロードとの関係
可変長引数を持つメソッドは、オーバーロードと組み合わせて使用することができますが、注意が必要です。
可変長引数を持つメソッドと、同じ引数の数を持つ他のメソッドが存在すると、コンパイラがどちらのメソッドを呼び出すかを判断できなくなる場合があります。
以下の例では、オーバーロードの問題を示しています。
using System;
class Program
{
static void Main(string[] args)
{
// Greet("山田"); // コンパイルエラー: どちらのメソッドを呼び出すか不明
Greet("山田", "こんにちは"); // 正常な呼び出し
}
static void Greet(string name) // 通常の引数
{
Console.WriteLine($"こんにちは、{name}さん!"); // 挨拶を出力
}
static void Greet(params string[] names) // 可変長引数
{
foreach (string name in names) // 配列としてループ処理
{
Console.WriteLine($"こんにちは、{name}さん!"); // 挨拶を出力
}
}
}
こんにちは、山田さん!
パフォーマンスへの影響
可変長引数を使用すると、内部的には配列が生成されるため、パフォーマンスに影響を与える可能性があります。
特に、大量の引数を渡す場合や、頻繁に呼び出されるメソッドでは、パフォーマンスが低下することがあります。
以下の例では、可変長引数を使用した場合のパフォーマンスへの影響を示しています。
using System;
using System.Diagnostics;
class Program
{
static void Main(string[] args)
{
Stopwatch stopwatch = new Stopwatch(); // 計測用のストップウォッチ
stopwatch.Start(); // 計測開始
// 大量の引数を渡す
CalculateSum(Enumerable.Range(1, 10000).ToArray()); // 可変長引数を使用
stopwatch.Stop(); // 計測終了
Console.WriteLine($"処理時間: {stopwatch.ElapsedMilliseconds}ms"); // 処理時間を出力
}
static void CalculateSum(params int[] numbers) // 可変長引数の定義
{
int sum = 0; // 合計を初期化
foreach (int number in numbers) // 配列としてループ処理
{
sum += number; // 各要素を合計
}
}
}
このように、可変長引数を使用する際は、パフォーマンスへの影響を考慮することが重要です。
特に、大量のデータを扱う場合は、他の方法を検討することも必要です。
応用例
可変長引数は、さまざまな場面で活用できます。
ここでは、可変長引数を使った具体的な応用例をいくつか紹介します。
可変長引数を使った合計計算メソッド
可変長引数を使用して、任意の数の数値の合計を計算するメソッドを作成できます。
以下の例では、可変長引数を受け取り、その合計を計算して出力します。
using System;
class Program
{
static void Main(string[] args)
{
int total = CalculateSum(10, 20, 30, 40, 50); // 可変長引数を渡す
Console.WriteLine($"合計: {total}"); // 合計を出力
}
static int CalculateSum(params int[] numbers) // 可変長引数の定義
{
int sum = 0; // 合計を初期化
foreach (int number in numbers) // 配列としてループ処理
{
sum += number; // 各要素を合計
}
return sum; // 合計を返す
}
}
合計: 150
可変長引数を使った文字列の結合
可変長引数を使用して、複数の文字列を結合するメソッドを作成できます。
以下の例では、可変長引数を受け取り、すべての文字列を結合して出力します。
using System;
class Program
{
static void Main(string[] args)
{
string result = ConcatenateStrings("こんにちは", "世界", "C#"); // 可変長引数を渡す
Console.WriteLine(result); // 結合した文字列を出力
}
static string ConcatenateStrings(params string[] strings) // 可変長引数の定義
{
return string.Join(" ", strings); // 文字列を結合
}
}
こんにちは 世界 C#
可変長引数を使ったログ出力
可変長引数を使用して、複数のメッセージを一度にログ出力するメソッドを作成できます。
以下の例では、可変長引数を受け取り、各メッセージをログとして出力します。
using System;
class Program
{
static void Main(string[] args)
{
LogMessages("処理開始", "データ読み込み中", "処理完了"); // 可変長引数を渡す
}
static void LogMessages(params string[] messages) // 可変長引数の定義
{
foreach (string message in messages) // 配列としてループ処理
{
Console.WriteLine($"[LOG] {message}"); // 各メッセージをログ出力
}
}
}
[LOG] 処理開始
[LOG] データ読み込み中
[LOG] 処理完了
可変長引数を使ったフィルタリング処理
可変長引数を使用して、特定の条件に基づいて要素をフィルタリングするメソッドを作成できます。
以下の例では、可変長引数を受け取り、指定した条件に合致する要素を出力します。
using System;
using System.Collections.Generic;
class Program
{
static void Main(string[] args)
{
FilterAndPrintEvenNumbers(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); // 可変長引数を渡す
}
static void FilterAndPrintEvenNumbers(params int[] numbers) // 可変長引数の定義
{
List<int> evenNumbers = new List<int>(); // 偶数を格納するリスト
foreach (int number in numbers) // 配列としてループ処理
{
if (number % 2 == 0) // 偶数かどうかをチェック
{
evenNumbers.Add(number); // 偶数をリストに追加
}
}
Console.WriteLine("偶数: " + string.Join(", ", evenNumbers)); // 偶数を出力
}
}
偶数: 2, 4, 6, 8, 10
これらの応用例を通じて、可変長引数の柔軟性と便利さを実感できるでしょう。
さまざまな場面で活用してみてください。
まとめ
この記事では、C#における可変長引数の使い方やその特性について詳しく解説しました。
可変長引数は、引数の数が不定である場合や同じ型のデータをまとめて処理したい場合に非常に便利な機能です。
これを活用することで、メソッドのインターフェースをシンプルに保ちながら、柔軟なプログラミングが可能になります。
ぜひ、実際のプロジェクトやコードに可変長引数を取り入れて、より効率的な開発を目指してみてください。