12

我有一个执行各种比较的分拣机。Resharper 说我应该从 更改String.CompareToString.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 m1.CompareTo(m2);
    }

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

比较序数:

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);
});
4

2 回答 2

17

Resharper 担心,如果您要在使用不同默认字符编码的系统上运行代码,则比较可能会失败。CompareOrdinal是文化不变的,从而消除了这个问题。

于 2012-08-14T00:05:37.653 回答
0

我的猜测是 Resharper 试图阻止空引用。

使用第一个代码片段时data1 或 data2 为null会发生什么情况?将此与第二个代码片段进行比较。

这种方式只是更安全一些。

编辑

在这两个片段中,第一个if都会失败,但我当然指的是比较部分:)

于 2012-08-13T21:00:16.243 回答