首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

Effective C# 原則 17:最小化裝箱與拆箱(二)

     編輯:關於C語言

隱式裝箱的常見情況

你或許不會自己寫這樣的程式碼,但編譯器自動從指定型別轉換為 System.Object,這確實是你做的。編譯器想幫助你,樂意在必要時產生裝箱拆箱語句,將實值型別轉為 System.Object 實例。為避免懲罰,在呼叫 WriteLine 前自行將型別轉為字串:

Console.WriteLine("A few numbers:{0}, {1}, {2} ", 25.ToString(), 32.ToString(), 50.ToString());

(譯註:自行呼叫 ToString 仍在堆積建立引用實例,但好處是免拆箱,因物件已是引用型別。)

此程式碼使用已知整數型別,實值型別不再隱式轉為 System.Object。避免裝箱第一規則:注意隱式轉換為 System.Object,若可避免,實值型別不應被 System.Object 取代。

.NET 1.x 集合中的裝箱陷阱

另一常見情況:使用 .NET 1.x 集合時,可能無意將實值型別轉為 System.Object。任何時候將實值型別加入集合,就建立箱子。從集合取出物件,得到的是箱子裡的副本。取出時總建立副本,產生隱藏 Bug,編譯器不會幫你找。讓我們建立可修改欄位的簡單結構,放入集合:

public struct Person
{
    private string _Name;
    public string Name { get { return _Name; } set { _Name = value; } }
    public override string ToString() { return _Name; }
}
ArrayList attendees = new ArrayList();
Person p = new Person("Old Name");
attendees.Add(p);
// 嘗試修改名稱:若 Person 為參考型別可行
Person p2 = ((Person)attendees[0]);
p2.Name = "New Name";
// 輸出 "Old Name"
Console.WriteLine(attendees[0].ToString());
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved