2010-05-10 77 views
50

我有下面的代碼行:ToLowerInvariant()有什麼問題?

var connectionString = configItems. 
       Find(item => item.Name.ToLowerInvariant() == "connectionstring"); 

VS 2010的代碼分析告訴我下面的:

警告7 CA1308:Microsoft.Globalization:在方法...更換調用'string.ToLowerInvariant()'與String.ToUpperInvariant()。

這是否意味着ToUpperInvariant()更可靠?

+28

但是請注意,使用'string.Equals(item.Name 「的ConnectionString」,StringComparison.OrdinalIgnoreCase)'可能是在這種特殊情況下,最好的辦法。 – 2010-05-10 09:21:02

+0

http://stackoverflow.com/questions/773703/normalization-of-strings-with-string-toupperinvariant – kenny 2012-12-01 22:22:34

回答

86

谷歌給出指向CA1308: Normalize strings to uppercase

它說一個提示:

字符串應該被歸爲大寫。一小部分人物在轉換爲小寫字母時不能往返。進行往返意味着將字符從一種語言環境轉換爲另一種不同的表示字符數據的語言環境,然後從轉換的字符中準確檢索原始字符。

所以,是的 - ToUpper比ToLower更可靠。

在未來,我建議首先谷歌搜索 - 我做的所有這些FxCop的警告我避開拋出;)有很大幫助讀取相應的文件;)

+10

+1「幫助閱讀相應的文檔」(也是絕對正確的......) – gehho 2010-05-10 09:47:04

+0

正確的,一些波蘭人不會進行ToLower()往返。 – 2013-08-30 13:53:49

+36

谷歌搜索引導我回到這個問題。 – richardtallent 2013-10-15 22:34:46

19

再說什麼TomTom公司說,.NET是優化字符串比較大寫。所以使用上部不變量在理論上比下部不變量更快。

這確實在CLR中通過C#聲明,如評論中指出的那樣。 以下鏈接引用本書的部分內容。我不確定這是否真的如此,因爲在MSDN上沒有關於此主題的信息。 msdn上的字符串比較指南提到toupperinvariant和tolowerinvariant是平等的,並不喜歡前者。

String comparisons in C#

+0

+1 true。我實際上在幾天前閱讀過這些內容,對於這種差異感到非常驚訝。不過,我認爲差異應該很小。 – gehho 2010-05-10 09:46:16

+0

對此有何參考?做.NET 10年並被認爲非常好 - 我不知道這一點;)願意有一些參考。 – TomTom 2010-05-10 09:52:13

+2

我想我通過C#(J Richter)在CLR中看到了這一點。儘管如此,仍然更喜歡使用顯式的StringComparer。 – 2010-05-10 10:03:27