我很好奇C#中的ToString()
方法。舉個例子如下:c#toString()性能
object height = 10;
string heightStr = height.ToString();
當我打電話ToString()
上height
,我得到一個字符串類型回來。運行時是否爲該字符串分配內存?
我很好奇C#中的ToString()
方法。舉個例子如下:c#toString()性能
object height = 10;
string heightStr = height.ToString();
當我打電話ToString()
上height
,我得到一個字符串類型回來。運行時是否爲該字符串分配內存?
是的。創建一個類的新實例(就像在這種情況下正在使用字符串類一樣)將爲實例分配內存。
我不太確定字符串是不可變的這個事實在這裏是相關的。他沒有修改'String'類的現有實例,而是將'ToString'函數的結果賦值給一個類型爲'string'的變量。即使它*不是不可變的,它將創建類的新實例。 – 2011-05-07 09:37:02
@Cody我提到它強調了所有字符串實例都分配了一個新的內存地址的事實。你是對的,它並不高度相關,但我認爲它可能會帶來一些額外的清晰度。無論如何,我已經刪除了提到不變性以避免混淆。 – 2011-05-07 09:39:15
是的,運行時將爲您創建或請求的任何字符串對象(包括從方法調用返回的字符串對象)分配內存。
但是不,這絕對是而不是你必須擔心的事情。它不會對你的應用程序的性能產生明顯的影響,你不應該屈服於過早優化代碼的誘惑。
Int32.ToString
方法非常快。它調用CLR級別編寫的本地代碼,這可能不會成爲任何應用程序中的性能瓶頸。
事實上,這裏的真正性能問題將是boxing,這是將一個值類型爲類型object
,然後再返回的過程。這將發生是因爲您聲明height
變量爲object
,然後爲其分配一個整數值。
這是一個更好的主意,顯式聲明height
爲int
類型,就像這樣:
int height = 10;
string heightStr = height.ToString();
一套裝箱/拆箱並不比分配一個字符串更低效。 – 2011-05-07 09:43:55
@Matti:不,一套可能不是。我必須看到性能數據是可以肯定的,但在這裏並不重要。我試圖做的區別是拳擊是值得一般避免的東西。在編寫.NET代碼時,它被認爲是「不好的做法」,這當然是每個人都需要知道的東西。字符串分配不是問題,也不是要避免的。重複的裝箱/拆箱操作在應用程序中導致性能問題的可能性更大。 – 2011-05-07 09:46:07
作爲一個小提示:如果你在一個值類型的變量/表達式上調用一個虛擬的方法(比如ToString()),那麼**不會顯式地覆蓋它。在'int'的情況下,*有一個顯式的int.ToString(),但事實並非總是如此。 – 2011-05-07 10:28:49
的ToString()是對人類,香水,是因爲他們不讀那麼快一個非問題。無論如何。 – 2011-05-07 12:16:32