2

我有一个简单的类,它有一个ToString我对内容很满意的实现。我试图通过查看各种选项是否有任何优点/缺点来决定什么是(最)正确的方法。

对于下面的示例:

  • 班级:Astronaut
  • 变量类型Astronautperson

我只是在这里滚雪球的选项:

  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";

我对这些的看法是

  1. 非常冗长,我不需要那种级别的冗长。
  2. 比 1 好得多,但ToString感觉很丑,而且担心ToString代码中的异常。
  3. 这似乎很受欢迎(here & here),但我不确定它是否会起作用。编译器不会抱怨 a string& aAstronaut类型不是同一类型,因此不能在 coalese 中使用。
  4. 这是我现在最满意的一个,但这意味着一个盒子 &ToString应该person为空。

总之:

  • 对上述任何一项有任何优点/缺点吗?
  • 你能想到什么选择吗?
4

4 回答 4

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");
于 2011-04-18T08:00:32.870 回答
3

创建一个静态ToString方法并像这样调用它:

string result = Astronaut.ToString(person);

分解通用代码的最佳方法。

于 2011-04-18T07:58:59.493 回答
1

我记得一本设计模式书告诉我你实例化的一些对象的唯一目的是填充空对象。他们将返回诸如 name 的空字符串或长度为 0 等内容。听起来不是个坏主意。

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

String result = Astronaut.getName(person);
于 2011-04-18T08:02:09.007 回答
0

您还可以在类中放置一个静态方法,将 Astronaut 转换为字符串,或者如果参数为 null,则返回“Unknown astronaut”。

同样,您可以将其设为扩展方法并直接在该类型的变量上调用它,即使它为空。

于 2011-04-18T08:00:25.643 回答