| 用法 | 關鍵字角色 | 核心目的 |
|---|---|---|
new 運算子 | 運算子 | 建立物件、呼叫建構函式、值型別預設初始化 |
new 修飾詞 | 修飾詞 | 隱藏基底類別成員 (非覆寫) |
new 約束 | 泛型型別參數約束 | 限定型別參數必須有公用無參建構函式 |
var myClass = new MyClass(); // 呼叫建構函式,配置 Managed Heap 記憶體
int i = new int(); // 等同 int i = 0;
var dt = new DateTime(); // 等同 DateTime.MinValue
對值型別呼叫無參建構函式即「零初始化」。
OutOfMemoryException。明確表示「我刻意隱藏基底同名成員」,消除編譯器警告 CS0108。
public class Base {
public int X;
public void Invoke() { }
}
public class Derived : Base {
new public void Invoke() { } // 隱藏 Base.Invoke
// new public int X; // 欄位隱藏同樣合法
}
new 與 override 互斥 (編譯錯誤)。
public class BaseC {
public class Nested { public int X = 200; }
}
public class DerivedC : BaseC {
new public class Nested { public int X = 100; } // 隱藏基底 Nested
}
static void Main() {
var d1 = new DerivedC.Nested(); // X = 100
var b1 = new BaseC.Nested(); // X = 200
Console.WriteLine($"{d1.X}, {b1.X}");
}
public T Create<T>() where T : new() {
return new T(); // 編譯器保證 T 有 public 無參建構函式
}
// 使用
var obj = Create<MyClass>(); // MyClass 必須有 public MyClass()
public class Repository<TEntity> where TEntity : class, new(), IEntity {
public TEntity Create() => new TEntity(); // 滿足 class + new() + 介面
}
掌握 `new` 三重身分,能精準表達「建立實體」、「刻意隱藏繼承」、「泛型建構約束」三種截然不同的語意,寫出更清晰、編譯器更能協助驗證的程式碼。