避免重複初始化程式碼,一個建構函式呼叫另一個:
class MyClass
{
private string _prefix = "ABC-";
public MyClass() => Console.WriteLine("MyClass");
public MyClass(string s) => Console.WriteLine(_prefix + s);
public MyClass(int n) : this() { Console.WriteLine(n); }
public MyClass(int x, int y) : this("XYZ") { Console.WriteLine(x + y); }
}
// 執行順序
new MyClass(); // MyClass
new MyClass("EFG"); // ABC-EFG
new MyClass(123); // MyClass / 123
new MyClass(111,222); // ABC-XYZ / 333
衍生類別**必須**透過 `base(...)` 顯式呼叫基底建構函式 (無參基底可省略):
abstract class Parent
{
private byte _id;
public Parent(byte n) => _id = n;
public byte Id { get => _id; set => _id = value; }
}
class Child : Parent
{
public Child(byte id) : base(id) { } // 必須傳 id 給基底
}
var c = new Child(6);
Console.WriteLine(c.Id); // 6
c.Id = 8;
Console.WriteLine(c.Id); // 8
class Person
{
public string Name { get; set; } = "Unknown"; // 初始化器
public int Age { get; init; } // C# 9: init 僅限物件初始化器指派
}
var p = new Person { Name = "Alice", Age = 30 };
// p.Age = 31; // 編譯錯誤 (init 唯讀)