2012-08-13 52 views
12

我有一個執行各種比較的分揀機。 Resharper說我應該從String.CompareTo改爲String.CompareOrdinal。這是真的提供了很多好處,還是我應該調整檢查規則?Resharper建議將CompareTo更改爲CompareOrdinal

的CompareTo:

config.Sort(delegate(configData data1, configData data2) 
{ 
    if (data1.SettingName.Equals(data2.SettingName)) 
    { 
     string m1 = data1.SettingMachine; 
     string m2 = data2.SettingMachine; 
     if (m1 == null) 
      m1 = string.Empty; 
     if (m2 == null) 
      m2 = string.Empty; 
     return m1.CompareTo(m2); 
    } 

    return data1.SettingName.CompareTo(data2.SettingName); 
}); 

CompareOrdinal:

config.Sort(delegate(configData data1, configData data2) 
{ 
    if (data1.SettingName.Equals(data2.SettingName)) 
    { 
     string m1 = data1.SettingMachine; 
     string m2 = data2.SettingMachine; 
     if (m1 == null) 
      m1 = string.Empty; 
     if (m2 == null) 
      m2 = string.Empty; 
     return String.CompareOrdinal(m1, m2); ; 
    } 

    return String.CompareOrdinal(data1.SettingName, data2.SettingName); 
}); 
+0

警告是「CompareTo是文化特定的」 – 2012-08-13 21:02:33

+0

也相關:http://stackoverflow.com/questions/10941375/could-string-comparisons-really-differ-based-on-culture-when-the-string- is-guara – 2012-08-13 21:03:04

+0

因此,從resharper的角度來看,它似乎是基於保持文化的理念推薦它 – Adam 2012-08-13 21:15:54

回答

17

ReSharper的的部分比較關注的是,如果你在系統上運行代碼這是使用不同的默認字符編碼,比較可能會失敗。 CompareOrdinal是文化不變的,從而消除了這個問題。

+1

是的,它真的更好。我已經多次看到字符串比較將「Bog」放在「Bóg」之下,反之亦然,這取決於操作系統語言,然後數據庫生成的排序順序與客戶端應用程序之間存在差異。有時,是不重要的,但如果你正在產生,即付款時間表,好.. :) – quetzalcoatl 2012-08-14 00:11:57

+0

謝謝你,這是我正在尋找學習。 – Adam 2012-08-14 15:53:00

0

我的猜測是,ReSharper的是試圖阻止空引用。

當使用第一個代碼片段時,會發生什麼情況是data1或data2是null?將其與第二個代碼片段進行比較。

這樣做比較安全。

編輯

在兩個片段,第一if會失敗,但我指的當然:)

+0

Resharper非常聰明 - 它也會知道(如你所提到的),'if'會首先拋出空引用異常 - 這肯定是一個文化相關的問題。 – 2012-08-14 00:07:14

相關問題