2009-08-09 23 views
1

.NET提供的String.Format(...)四個非常相似的版本(不包括一個接受一個IFormatProvider參數):爲什麼string.Format有幾種口味?

Format(String, Object)
替換與指定對象的字符串表示一個指定的字符串的一個或多個格式的項目。
Format(String, Object, Object)
用兩個指定對象的字符串表示替換指定字符串中的格式項。 Format(String, Object, Object, Object)
用三個指定對象的字符串表示替換指定字符串中的格式項目。 Format(String, Object[])
將指定字符串中的格式項替換爲指定數組中相應對象的字符串表示形式。

爲什麼不能只有一個(params) object[]論點?對於具有固定參數數量(1,2和3)的獨立方法,是否有性能增益?
據推測,現實世界中大多數對string.Format的調用都有1-3個參數。

+1

有一個params重載:'公共靜態字符串格式(字符串格式,params對象[] args);' – 2009-08-09 22:15:04

+0

這就是我的意思'爲什麼不只有一個params對象[]參數?'...我會清除它。 – 2009-08-10 00:23:26

+0

我的觀點是,爲什麼還有其他三個版本? – 2009-08-10 00:25:03

回答

4

這可能是早期實現.NET框架的遺留問題;如果你看* 格式(字符串,對象),格式(字符串,對象,對象)等方法的實現,你會看到他們都調用格式(IFormatProvider,字符串,對象[])。因此,絕對沒有任何性能優勢(如果您的構建在調試模式下運行,調用對象過載的效率更低 - 而不是您可以測量它)。

我能想到的唯一技術原因是這些重載對於不支持params參數的語言很有用。在這種情況下,程序員仍然可以調用String.Format(「Hello {0}」,「world」),而不是強制他們創建一個臨時數組(這是params參數建議編譯器要做的)。這也解釋了爲什麼只有3個對象重載:它們覆蓋了所有String.Format調用的99%。

*)使用反射器或過時的轉子代碼庫。

1

是的。與構建數組並傳遞該數組有關的性能差異,而不是簡單地將單個參數傳遞給堆棧。此外,由於.NET旨在支持多種語言,因此他們可能會這樣做以支持正常的String.Format語法,用於某些可能的假設語言,該語言不支持自動打包params數組參數。

+0

如果性能問題,爲什麼要使用String.Format? – Zyphrax 2009-08-09 22:15:43

+0

好吧。如果你自己寫了'String.Format'函數,你可能會選擇不關心,但微軟在很多情況下都會建立一個框架。他們從每個處理器週期中獲得最大收益是有道理的。 – 2009-08-09 22:30:11