在C#中,将字符串与null进行比较以及""返回true的最佳方法是什么

leo*_*ora 10 c# string string-comparison

我有以下代码(因为我试图检测字段的更改)

 if (person.State != source.State)
 {
      //update my data . .
  }
Run Code Online (Sandbox Code Playgroud)

问题是我遇到的情况是person.State为NULL而source.State为"",因此返回true.

如果一个为null而另一个是空字符串,我想将它们视为相等并且不更新我的数据.这样做最干净的方法是什么?我是否需要创建自己的Comparer对象,因为这似乎是一个普遍的问题

小智 20

如果你真的需要,你可以这样做:

if ((person.State ?? string.Empty) != (source.State ?? string.Empty))
{
    // ...
}
Run Code Online (Sandbox Code Playgroud)

但是,根据您的需要,更好的解决方案可能是将person.State属性修改为永不返回空值.

public class Person
{
    string _state = string.Empty;
    public string State
    {
        get { return _state; }
        set { _state = value ?? string.Empty; }
    }
}
Run Code Online (Sandbox Code Playgroud)

  • @MarcGravell老实说,我觉得`string.Emtpy`更容易阅读.对那个人有一点看法. (7认同)
  • 一个非常小的观察(与问题无关),但是``"`和`string.Empty`一样有效,更容易阅读,并且不会被反射滥用......`typeof(string).GetField ("Empty").SetValue(null,""); //邪恶的 (2认同)
  • @MarcGravell [StyleCop推荐使用string.Empty而不是""](http://stylecop.soyuz5.com/SA1122.html).我不确定是赞成还是反对的原因. (2认同)

Mar*_*ell 12

就个人而言,我会对上游进行消毒/规范化,但如果我必须在这里进行:

// check different, treating null & "" as equivalent
if ((person.State ?? "") != (source.State ?? ""))
Run Code Online (Sandbox Code Playgroud)


Ser*_*rvy 8

虽然其他答案都很好,但我会将它们引入自己的方法,以使读者更清楚:

public static bool StatesEqual(string first, string second)
{
  return first ?? "" == second ?? "";
}
Run Code Online (Sandbox Code Playgroud)

如果您在多个位置比较这些状态,或者允许您处理其他奇怪的情况,这将是有益的.(示例可能是将其更改为不区分大小写,或者如果两个状态在文本上不同,但是一个是另一个的缩写,即您希望"WI"等于"Wisconsin".