new 運算子:
new 運算子會建立型別的新執行個體。 您也可以使用 new 關鍵字作為成員宣告修飾詞或泛型型別條件約束。
C# 語言參考資料記錄了 C# 語言最新版本。 同時也包含即將推出語言版本公開預覽功能的初步文件。
文件中標示了語言最近三個版本或目前公開預覽版中首次引入的任何功能。
小提示
欲查詢某功能何時首次在 C# 中引入,請參閱 C# 語言版本歷史的條目。
建構函式引動過程
要建立一個新的型別實例,請使用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 運算式詳細資訊,請參閱功能提案附註。