new 演算子 (C# リファレンス)

new 演算子は型の新しいインスタンスを作成します。

new キーワードは、メンバーの宣言修飾子またはジェネリック型制約として使用することもできます。

コンストラクターの呼び出し

型の新しいインスタンスを作成するには、通常は new 演算子を使用して、その型のコンストラクターの 1 つを呼び出します。

var dict = new Dictionary<string, int>();
dict["first"] = 10;
dict["second"] = 20;
dict["third"] = 30;

Console.WriteLine(string.Join("; ", dict.Select(entry => $"{entry.Key}: {entry.Value}")));
// Output:
// first: 10; second: 20; third: 30

オブジェクトまたはコレクション初期化子new 演算子と共に使用して、1 つのステートメント内でオブジェクトのインスタンス化と初期化を行うことができます。次に例を示します。

var dict = new Dictionary<string, int>
{
    ["first"] = 10,
    ["second"] = 20,
    ["third"] = 30
};

Console.WriteLine(string.Join("; ", dict.Select(entry => $"{entry.Key}: {entry.Value}")));
// Output:
// first: 10; second: 20; third: 30

C# 9.0 以降、コンストラクターの呼び出し式はターゲット型になっています。 つまり、式のターゲット型がわかっている場合は、次の例に示すように、型名を省略できます。

List<int> xs = new();
List<int> ys = new(capacity: 10_000);
List<int> zs = new() { Capacity = 20_000 };

Dictionary<int, List<int>> lookup = new()
{
    [1] = new() { 1, 2, 3 },
    [2] = new() { 5, 8, 3 },
    [5] = new() { 1, 0, 4 }
};

前の例に示されているように、ターゲット型の new 式では常にかっこを使用します。

new 式のターゲット型が不明な場合 (たとえば var キーワードを使用する場合) は、型名を指定する必要があります。

配列の作成

new 演算子を使用して配列インスタンスを作成することもできます。次に例を示します。

var numbers = new int[3];
numbers[0] = 10;
numbers[1] = 20;
numbers[2] = 30;

Console.WriteLine(string.Join(", ", numbers));
// Output:
// 10, 20, 30

1 つのステートメント内で配列の初期化構文を使用して配列インスタンスを作成し、そこに要素を設定します。 次の例に、これを行うためのさまざまな方法を示します。

var a = new int[3] { 10, 20, 30 };
var b = new int[] { 10, 20, 30 };
var c = new[] { 10, 20, 30 };
Console.WriteLine(c.GetType());  // output: System.Int32[]

配列の詳細については、「配列」を参照してください。

匿名型のインスタンス化

匿名型のインスタンスを作成するには、new 演算子とオブジェクト初期化子構文を使用します。

var example = new { Greeting = "Hello", Name = "World" };
Console.WriteLine($"{example.Greeting}, {example.Name}!");
// Output:
// Hello, World!

型インスタンストの破棄

以前作成した型のインスタンスを破棄する必要はありません。 参照型と値型のインスタンスは両方とも自動的に破棄されます。 値型のインスタンスは、それらを格納しているコンテキストが破棄されるとすぐに破棄されます。 参照型のインスタンスはガベージ コレクターによって、そのインスタンスへの最後の参照が削除された後、不特定のタイミングで破棄されます。

ファイル ハンドルなどのアンマネージド リソースを含む型インスタンスの場合、格納されているリソースができるだけ早く確実に解放されるように、決定的なクリーンアップを使用することをお勧めします。 詳細については、System.IDisposable API リファレンスと using ステートメントに関する記事を参照してください。

演算子のオーバーロード可/不可

ユーザー定義型は new 演算子をオーバーロードできません。

C# 言語仕様

詳細については、C# 言語仕様new 演算子に関するセクションを参照してください。

ターゲット型の new 式について詳しくは、機能提案メモをご覧ください。

参照