在 C# 中,new 運算符是建立類型實例的核心機制。它不僅負責記憶體配置,還執行建構函式初始化。理解其三種表達式形式與底層行為,對編寫高效、安全的程式碼至關重要。
用於建立類別(參考類型)或結構(值類型)的實例:
// 類別實例(參考類型,配置在堆積)
var person = new Person("張三", 25);
// 結構實例(值類型,通常配置在堆疊)
var point = new Point(10, 20);
建立一維、多維或交錯陣列:
// 一維陣列
int[] numbers = new int[5] { 1, 2, 3, 4, 5 };
// 多維陣列
double[,] matrix = new double[3, 3];
// 交錯陣列
string[][] jagged = new string[3][];
建立委派實例,綁定方法:
// 委派宣告 delegate double MathOperation(double x, double y); // 建立委派實例 MathOperation add = new MathOperation((a, b) => a + b); MathOperation multiply = new MathOperation(Math.Multiply);
與 C++ 不同,C# 的 new 不直接操作指標,而是由 CLR 管理:
簡化屬性設定,提升可讀性:
var employee = new Employee
{
Name = "李四",
Age = 30,
Department = "工程部"
};
當類型可從上下文推斷時,可省略類型名稱:
List<string> names = new() { "A", "B", "C" };
Dictionary<int, string> dict = new() { [1] = "One" };
結構隱含無參數建構函式(將所有欄位歸零),不可自訂:
struct Point { public int X, Y; }
var p = new Point(); // X=0, Y=0
// 隱含陣列大小
int[] scores = new[] { 90, 85, 95 };
// 多維陣列初始化
int[,] grid = new[,] { {1, 2}, {3, 4} };
var anon = new { Id = 1, Name = "測試", IsActive = true };
| 場景 | 建議 | 理由 |
|---|---|---|
| 高頻建立小型值類型 | 使用結構、物件池 | 減少 GC 壓力、避免裝箱 |
| 大型陣列重複使用 | Array.Clear 或 ArrayPool | 避免頻繁配置/回收 |
| 委派建立 | 快取委派實例、使用 Lambda | 減少物件配置開銷 |
| 不可變物件 | 使用 record 或 readonly struct | 語意清晰、執行緒安全 |
object 或介面會觸發裝箱var b = a; 只複製參考,非深層複製精通 new 運算符的各種形式與底層機制,能幫助您做出更明智的架構決策,編寫高效能、低記憶體佔用的 C# 應用程式。