將值型別放入 ArrayList 時,會發生裝箱。嘗試修改屬性:
((Person)arrPersons[0]).Name = "NewName"; // 編譯錯誤
因為轉型產生的是臨時拷貝,修改不影響原物件。
public interface IPersonName { string Name { get; set; } }
public struct Person : IPersonName { /* 實作 */ }
// 使用介面修改 - 成功
((IPersonName)arrPersons[0]).Name = "NewName";
關鍵在於產生臨時變數的型別不同:介面屬引用型別,相當於原物件的引用。
介面存取的成員若為值型別,則仍會發生裝箱/拆箱,無法減少開銷。
頻繁裝箱/拆箱降低程式效能,編寫程式碼時應盡量避免。善用介面技巧可同時解決正確性與效能問題。