new 演算子 (C# リファレンス)
更新 : 2007 年 11 月
オブジェクトを作成し、コンストラクタを呼び出します。次に例を示します。
Class1 obj = new Class1();
匿名型のインスタンスの作成にも使用できます。
var query = from cust in customers
select new {Name = cust.Name, Address = cust.PrimaryAddress};
new 演算子を使用して、値型の既定コンストラクタを呼び出すこともできます。次に例を示します。
int i = new int();
このステートメントでは、i は int 型の既定値 0 に初期化されます。このステートメントは次のステートメントと同じ効果があります。
int i = 0;
既定値の一覧については、「既定値の一覧表 (C# リファレンス)」を参照してください。
構造体の既定のコンストラクタを宣言すると、エラーが発生します。これは、すべての値型には、暗黙的にパブリックな既定のコンストラクタがあるためです。パラメータ付きのコンストラクタを struct 型で宣言してその初期値を設定することは可能ですが、この手順が必要になるのは、既定以外の値が必要な場合のみです。
構造体のような値型オブジェクトはスタック領域に作成され、クラスのような参照型オブジェクトはヒープ領域に作成されます。どちらの型のオブジェクトも自動的に破棄されますが、値型に基づくオブジェクトは、スコープの適用範囲の外になると破棄され、参照型に基づくオブジェクトは、そのオブジェクトへの最後の参照が削除された後に随時破棄されます。大量のメモリ、ファイル ハンドル、ネットワーク接続などの固定リソースを消費する参照型では、オブジェクトができるだけすぐに破棄されるように、確定的な終了処理を採用することが望ましい場合があります。詳細については、「using ステートメント (C# リファレンス)」を参照してください。
new 演算子はオーバーロードできません。
new 演算子によるメモリ割り当てが失敗した場合は、OutOfMemoryException 例外がスローされます。
使用例
次の例では、struct オブジェクトとクラス オブジェクトは、new 演算子で作成および初期化されてから、値が代入されます。既定値と代入値が表示されます。
struct SampleStruct
{
public int x;
public int y;
public SampleStruct(int x, int y)
{
this.x = x;
this.y = y;
}
}
class SampleClass
{
public string name;
public int id;
public SampleClass() {}
public SampleClass(int id, string name)
{
this.id = id;
this.name = name;
}
}
class ProgramClass
{
static void Main()
{
// Create objects using default constructors:
SampleStruct Location1 = new SampleStruct();
SampleClass Employee1 = new SampleClass();
// Display values:
Console.WriteLine("Default values:");
Console.WriteLine(" Struct members: {0}, {1}",
Location1.x, Location1.y);
Console.WriteLine(" Class members: {0}, {1}",
Employee1.name, Employee1.id);
// Create objects using parameterized constructors:
SampleStruct Location2 = new SampleStruct(10, 20);
SampleClass Employee2 = new SampleClass(1234, "Luciana Ramos");
// Display values:
Console.WriteLine("Assigned values:");
Console.WriteLine(" Struct members: {0}, {1}",
Location2.x, Location2.y);
Console.WriteLine(" Class members: {0}, {1}",
Employee2.name, Employee2.id);
}
}
/*
Output:
Default values:
Struct members: 0, 0
Class members: , 0
Assigned values:
Struct members: 10, 20
Class members: Luciana Ramos, 1234
*/
この例では、文字列の既定値が null です。このため、文字列の既定値は出力されません。
C# 言語仕様
詳細については、「C# 言語仕様」の次のセクションを参照してください。
- 7.5.10 new 演算子