配列の初期化とArray.Fill
C#でnew int[10]のように配列を宣言すると、その配列の各要素は自動的にその型のデフォルト値(intなら0、boolならfalse、stringなどの参照型ならnull)で初期化されます。
しかし、プログラムのロジック上、「配列のすべての要素を0以外の特定の値(例: -1やtrue、あるいは特定の文字列)で埋めておきたい」という場合があります。
従来、この操作はforループを使用して手動で行う必要がありました。
// 従来のforループによる初期化
int[] scores = new int[5];
for (int i = 0; i < scores.Length; i++)
{
scores[i] = -1; // すべての要素に -1 を代入
}
この処理をより簡潔かつ効率的に行うために、.NET Core 2.0 (.NET Standard 2.1) 以降、System.ArrayクラスにFillメソッドが追加されました。
Array.Fill メソッドの基本
Array.Fillは、指定された配列のすべての要素に、指定された値を設定する静的メソッドです。
基本構文: Array.Fill<T>(T[] array, T value)
T[] array: 値を埋めたい対象の配列。T value: 配列のすべての要素に設定する値。
コード例1:値型(int)の配列を埋める
int型(値型)の配列を作成し、そのすべての要素をデフォルト値の0ではなく、 -1(「未設定」や「無効」を示す値としてよく使われる)で埋める例です。
using System;
public class ArrayFillValueTypeExample
{
public static void Main()
{
// 1. サイズ 5 の int 配列を作成 (中身はすべて 0)
int[] dataPoints = new int[5];
// 2. Array.Fill を使用して、すべての要素を -1 で埋める
Array.Fill(dataPoints, -1);
// 3. 結果の確認
Console.WriteLine("--- int[] の Array.Fill 結果 ---");
foreach (var point in dataPoints)
{
Console.Write($"{point} ");
}
Console.WriteLine();
}
}
出力結果:
--- int[] の Array.Fill 結果 ---
-1 -1 -1 -1 -1
コード例2:参照型(string)の配列を埋める
Array.Fillは、intのような値型だけでなく、stringなどの参照型にも使用できます。
using System;
public class ArrayFillReferenceTypeExample
{
public static void Main()
{
// 1. サイズ 3 の string 配列を作成 (中身はすべて null)
string[] statusSlots = new string[3];
// 2. すべての要素を "Pending" という文字列で埋める
Array.Fill(statusSlots, "Pending");
// 3. 結果の確認
Console.WriteLine("--- string[] の Array.Fill 結果 ---");
foreach (var status in statusSlots)
{
Console.WriteLine($"ステータス: {status}");
}
}
}
出力結果:
--- string[] の Array.Fill 結果 ---
ステータス: Pending
ステータス: Pending
ステータス: Pending
参照型での注意点
Array.Fillを参照型(string以外で、内容を変更できるオブジェクト)で使用する場合、配列のすべての要素は同一のインスタンスを参照することになります。string型は不変(Immutable)であるため問題になりませんが、もし可変(Mutable)なオブジェクト(例: new StringBuilder())で配列を埋めた場合、一つの要素への変更が、配列のすべての要素に影響するため注意が必要です。
補足:Array.Fillが利用できない環境
Array.Fillメソッドは、.NET Core 2.0 / .NET Standard 2.1 / .NET 5 以降で利用可能です。
もし、古い .NET Framework(例: 4.7.1以前)など、このメソッドがサポートされていない環境で開発している場合は、従来どおりforループを使用して配列を初期化する必要があります。
// Array.Fill が使えない場合の代替
int arraySize = 10;
int[] legacyArray = new int[arraySize];
int defaultValue = -1;
for (int i = 0; i < legacyArray.Length; i++)
{
legacyArray[i] = defaultValue;
}
まとめ
Array.Fillメソッドは、C#で配列の全要素を特定のデフォルト値(0やnull以外)で効率的に初期化するための標準的な方法です。
forループを記述するよりもコードが1行で簡潔になり、処理の意図(「配列をこの値で埋める」)が明確になります。
