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

new 演算子は型の新しいインスタンスを作成します。The new operator creates a new instance of a type.

new キーワードは、メンバーの宣言修飾子またはジェネリック型制約として使用することもできます。You can also use the new keyword as a member declaration modifier or a generic type constraint.

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

型の新しいインスタンスを作成するには、通常は new 演算子を使用して、その型のコンストラクターの 1 つを呼び出します。To create a new instance of a type, you typically invoke one of the constructors of that type using the new operator:

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 つのステートメント内でオブジェクトのインスタンス化と初期化を行うことができます。次に例を示します。You can use an object or collection initializer with the new operator to instantiate and initialize an object in one statement, as the following example shows:

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 以降、コンストラクターの呼び出し式はターゲット型になっています。Beginning with C# 9.0, constructor invocation expressions are target-typed. つまり、式のターゲット型がわかっている場合は、次の例に示すように、型名を省略できます。That is, if a target type of an expression is known, you can omit a type name, as the following example shows:

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 式では常にかっこを使用します。As the preceding example shows, you always use parentheses in a target-typed new expression.

new 式のターゲット型が不明な場合 (たとえば var キーワードを使用する場合) は、型名を指定する必要があります。If a target type of a new expression is unknown (for example, when you use the var keyword), you must specify a type name.

配列の作成Array creation

new 演算子を使用して配列インスタンスを作成することもできます。次に例を示します。You also use the new operator to create an array instance, as the following example shows:

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

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

1 つのステートメント内で配列の初期化構文を使用して配列インスタンスを作成し、そこに要素を設定します。Use array initialization syntax to create an array instance and populate it with elements in one statement. 次の例に、これを行うためのさまざまな方法を示します。The following example shows various ways how you can do that:

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[]

配列の詳細については、「配列」を参照してください。For more information about arrays, see Arrays.

匿名型のインスタンス化Instantiation of anonymous types

匿名型のインスタンスを作成するには、new 演算子とオブジェクト初期化子構文を使用します。To create an instance of an anonymous type, use the new operator and object initializer syntax:

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

型インスタンストの破棄Destruction of type instances

以前作成した型のインスタンスを破棄する必要はありません。You don't have to destroy earlier created type instances. 参照型と値型のインスタンスは両方とも自動的に破棄されます。Instances of both reference and value types are destroyed automatically. 値型のインスタンスは、それらを格納しているコンテキストが破棄されるとすぐに破棄されます。Instances of value types are destroyed as soon as the context that contains them is destroyed. 参照型のインスタンスはガベージ コレクターによって、そのインスタンスへの最後の参照が削除された後、不特定のタイミングで破棄されます。Instances of reference types are destroyed by the garbage collector at some unspecified time after the last reference to them is removed.

ファイル ハンドルなどのアンマネージド リソースを含む型インスタンスの場合、格納されているリソースができるだけ早く確実に解放されるように、決定的なクリーンアップを使用することをお勧めします。For type instances that contain unmanaged resources, for example, a file handle, it's recommended to employ deterministic clean-up to ensure that the resources they contain are released as soon as possible. 詳細については、System.IDisposable API リファレンスと using ステートメントに関する記事を参照してください。For more information, see the System.IDisposable API reference and the using statement article.

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

ユーザー定義型は new 演算子をオーバーロードできません。A user-defined type cannot overload the new operator.

C# 言語仕様C# language specification

詳細については、C# 言語仕様new 演算子に関するセクションを参照してください。For more information, see The new operator section of the C# language specification.

ターゲット型の new 式について詳しくは、機能提案メモをご覧ください。For more information about a target-typed new expression, see the feature proposal note.

参照See also