new 運算子:new 運算子會建立型別的新執行個體

new 運算子會建立型別的新執行個體。 您也可以使用 new 關鍵字作為成員宣告修飾詞泛型型別條件約束

建構函式引動過程

若要建立型別的新執行個體,您通常會使用 new 運算子叫用該型別的其中一個建構函式

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 運算子使用物件或集合初始設定式,來在單一陳述式中具現化和初始化物件,如下列範例所示:

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

目標類型 new

建構函式調用表達式是目標型別。 也就是說,如果已知運算式的目標型別,您可以省略型別名稱,如下列範例所示:

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

在單一陳述式中使用陣列初始化語法建立陣列執行個體,並使用項目。 下列範例會示範執行該操作的各種方式:

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 運算式詳細資訊,請參閱功能提案附註

另請參閱