测试NULL和&如果需要,返回一个字符串 - 优点/缺点是什么

时间:2011-04-18 07:55:42

标签: c# string null coalesce

我有一个简单的类,其中实现了ToString,我对内容感到满意。我试图通过查看各种选项是否有任何专业人士/骗局来决定(最)正确的方式。

对于以下示例:

  • 分类:Astronaut
  • Astronaut类型的变量:person

我只是在这里滑雪的选项:

  1. string result = person == null ? "Unknown Astronaut" : person.ToString();
  2. string result = person.ToString() ?? "Unknown Astronaut";
  3. string result = (person ?? "Unknown Astronaut").ToString();
  4. string result = person ?? (object)"Unknown Astronaut";
  5. 我对这些的看法是

    1. 非常详细&我不需要那种程度的冗长。
    2. 比1好多了,但ToString感觉很丑,再担心ToString代码中的例外情况。
    3. 这似乎很受欢迎(here& here),但我不确定它会奏效。编译器不会抱怨string& Astronaut类型不是同一类型,因此不能用于coalese。
    4. 这是我现在最开心的一个,但它意味着一个盒子& ToString应该person为空。
    5. 总结:

      • 任何与上述任何人的关系?
      • 您能想到的任何选项?

4 个答案:

答案 0 :(得分:6)

我更喜欢扩展方法:

public static string SafeToString(this Object obj)
{
   return obj.SafeToString(string.Empty);
}

public static string SafeToString(this Object obj, string defaultString)
{
   return obj == null ? defaultString : obj.ToString();
}

那么你的问题是:

string result = person.SafeToString("Unknown Astronaut");

答案 1 :(得分:3)

创建一个静态ToString方法,并将其称为:

string result = Astronaut.ToString(person);

分解公共代码的最佳方式。

答案 2 :(得分:1)

我记得一本设计模式书告诉我你为了填充空对象而实例化的一些对象。它们会返回名称为空字符串的内容,或者长度为0的内容,依此类推。听起来不是一个坏主意。

您还可以将其实现为Astronaut类的静态方法:

String result = Astronaut.getName(person);

答案 3 :(得分:0)

您还可以在将宇航员转换为字符串的类中放置静态方法,如果参数为null,则返回“未知宇航员”。

以类似的方式,你可以使它成为一个扩展方法,并直接在该类型的变量上调用它,即使它是null。