[ASP.NET] ToString() ? Boxing ?

  • 4803
  • 0

[ASP.NET] ToString() ? Boxing ?

當我們在程式中利用for loop來做一些事情時,有時會見到類似以下的Code


string result = string.Empty;

for (int i = 0; i < 100000; i++)
{
	result += i; //把i拿來做字串組合,做其它事情
}

在類似的程式中,int i被拿來做字串組合,然後做其它事情,例如:抓取具有

ID值具有固定命名規則的控制項,像是ID= xxx1 ~ xxx100。但是同時我們也

可能看到以下的寫法


string result = string.Empty;

for (int i = 0; i < 100000; i++)
{
	result += i.ToString(); //把i拿來做字串組合,做其它事情
}

 

二者的差別只在於有沒有ToString(),就功能上來說二個寫法都可以順利執行

,既然都可以順利執行,那麼有沒有ToString()有差嗎?

 

從效能上來看答案是肯定的,在程式寫作上我們都應該避免不必要的Boxing

和 Unboxing ,在第一個寫法上基本上我們可以合理的懷疑程式在run的過程

中是做了Boxing,為了證實這點我們藉由il檔來實際看看,果不其然是有Boxing

的過程,而第二種寫法則沒有Boxing的過程(如下圖所示)

image

 

image

 

此時或許您會質疑,說不定System.Int32的ToString()Method裡也是Boxing啊

然而關於這點我們可以從文件上來證明,在『Object.ToString 方法』文件有提到

ToString 是 .NET Framework 中主要的格式化方法。 它會將物件轉換為其字串

表示形式,使它適合於顯示。

型別通常會覆寫 ToString 方法,以傳回表示物件執行個體的字串。 例如,基底

型別 (例如,Char、Int32 和 String) 會提供 ToString 實作,傳回物件表示之值的

字串格式。 下列範例會定義 Object2 類別,這個類別覆寫 ToString 方法以傳回型

別名稱與其值。』,也就是通常在型別中會對ToString()覆寫,回傳其Value。

 

此外做了點簡單測試,分別以二種寫法進行10000次的實測,看看其花費的時間成本

image

 

結論:

雖然實測差距並沒有很大,不過既然明確知道第一種寫法會有Boxing的情況發生,建議也

就盡量避免吧,多打個ToString()不會花費多少的coding時間,但卻可以減少一個影響

效能因子,何樂而不為呢!

 

PS:例子可能舉的不太好,對於字串相加的寫法效能問題,不在本議題中 XD (感謝91的提醒,呵)

 

Ref:

Boxing 和 Unboxing (C# 程式設計手冊)

string (C# 參考)

Object.ToString 方法

Boxing 轉換 (C# 程式設計手冊)

 

 

 

 

若本文對您有所幫助,歡迎轉貼,但請在加註【轉貼】及來源出處,並在附上本篇的超連結,感恩您的配合囉。

By No.18