string id = new MyClass().GetId(); // 創建對象並調用方法
// 後續想再次使用這個 new MyClass() 對象,該怎麼辦?
無法直接獲取。 沒有變量引用的對象稱為「匿名對象」,語句執行完畢後即不可達,隨後會被 GC 回收。**想後續使用,必須在創建時賦值給變量。**
// 1. 存入變量,隨時可用
MyClass obj = new MyClass();
string id = obj.GetId();
// 後續繼續使用 obj
obj.DoSomething();
// 2. 若僅需鏈式調用一次,可用匿名對象
string id = new MyClass().GetId(); // 用完即丟,無後續需求時適用
| 誤區 | 後果 |
|---|---|
| 以為能通過類型反射獲取 | CLR 不維護「所有已創建實例」的全局列表,無法反射枚舉。 |
| 以為能靠 finalize 復活 | finalize 已棄用,且對象已不可達,無法復活。 |
| 覺得變量佔內存 | 引用變量僅 4/8 字節,對象本體在堆上,變量不佔對象內存。 |
若類設計為 Builder / Fluent API,支持鏈式調用:
// 設計時返回 this
public class MyClass {
public MyClass SetName(string n) { Name = n; return this; }
public MyClass SetAge(int a) { Age = a; return this; }
public string Build() { return $"{Name}-{Age}"; }
}
// 使用時真正「一次語句完成構建並獲取結果」
string result = new MyClass().SetName("Tom").SetAge(18).Build();
給對象一個名字(變量),是面向對象編程中最基本的契約。