如何为一个可能为空的对象做ToString?

cod*_*nix 84 .net c# string null object

有一种简单的方法可以执行以下操作:

String s = myObj == null ? "" : myObj.ToString();
Run Code Online (Sandbox Code Playgroud)

我知道我可以做到以下几点,但我真的认为它是一个黑客:

String s = "" + myObj;
Run Code Online (Sandbox Code Playgroud)

如果Convert.ToString()有一个适当的重载将是很好的.

And*_*lon 155

C#6.0编辑:

使用C#6.0,我们现在可以拥有一个简洁,无版本的orignal方法:

string s = myObj?.ToString() ?? "";
Run Code Online (Sandbox Code Playgroud)

甚至:

string s = $"{myObj}";
Run Code Online (Sandbox Code Playgroud)

原答案:

String s = (myObj ?? String.Empty).ToString();
Run Code Online (Sandbox Code Playgroud)

要么

String s = (myObjc ?? "").ToString()
Run Code Online (Sandbox Code Playgroud)

更简洁.

不幸的是,正如已经指出的那样,你经常需要在任何一方使用强制转换来使用非String或Object类型:

String s = (myObjc ?? (Object)"").ToString()
String s = ((Object)myObjc ?? "").ToString()
Run Code Online (Sandbox Code Playgroud)

因此,尽管它看起来很优雅,但演员几乎总是必要的,并且在实践中并不简洁.

正如其他地方所建议的,我建议使用扩展方法来使这个更干净:

public static string ToStringNullSafe(this object value)
{
    return (value ?? string.Empty).ToString();
}
Run Code Online (Sandbox Code Playgroud)

  • 向下投掷该对象是非常丑陋并涉及拳击. (3认同)

Hol*_*roe 40

string.Format("{0}", myObj);
Run Code Online (Sandbox Code Playgroud)

string.Format将null格式化为空字符串,并在非null对象上调用ToString().据我了解,这就是你要找的东西.

  • 我个人不喜欢这个.代码可能比String s = myObj == null短得多?"":myObj.ToString(),但你完全隐瞒了你的方法背后的原因. (3认同)

Rob*_*iam 14

如果Convert.ToString()有一个适当的重载将是很好的.

Convert.ToString(Object value)从那以后就出现了.Net 2.0(在问Q之前大约5年),这看起来完全符合你的要求:

http://msdn.microsoft.com/en-us/library/astxcyeh(v=vs.80).aspx

我错过/误解了一些非常明显的东西吗?

  • 你没有,他们有。当它可以复杂时为什么简单:) (2认同)

Pie*_*kel 13

使用扩展方法,您可以完成此任务:

public static class Extension
{
    public static string ToStringOrEmpty(this Object value)
    {
        return value == null ? "" : value.ToString();
    }
}
Run Code Online (Sandbox Code Playgroud)

以下内容不会向屏幕写入任何内容,也不会抛出异常:

        string value = null;

        Console.WriteLine(value.ToStringOrEmpty());
Run Code Online (Sandbox Code Playgroud)

  • 当"first"参数(`this`参数)时,扩展方法不会抛出,因为它们只是语法糖.那就是`x.SomeExtensionMethod()`是`SomeStaticClass.SomeExtensionMethod(x)的语法糖;`因此,当`x`是'null`时,我们不是试图在`null`对象上调用一个方法而是通过一个`null`对象为静态方法.当且仅当该方法检查"null"参数并且在遇到这样的情况时抛出将在"null"对象throw上"调用"扩展方法. (3认同)
  • 它补充说,您不必键入"{0}",并且可以选择描述您正在执行的操作的方法名称.当你多次这样做时,这尤其有用.您甚至可以将方法命名为ToStringOrEmptyWhenNull. (2认同)
  • 如果OP认为`string s =“” + myObj;`有点黑,那么在null对象上调用函数应该落入同一条船。我会对此表示反对,但是它确实解决了手头的问题,我只是不同意用法。即使在扩展方法中,空对象也应抛出“ NullReferenceException”。 (2认同)
  • @NickLarsen:我在大多数情况下都同意你的意见,但有时你只是想要一个简单方法调用的便利.方法名称应该为您提供一个提示,即空引用是正常的,就像使用`ToStringOrEmptyWhenNull`的提议一样. (2认同)

ste*_*nar 7

我不同意这个:

String s = myObj == null ? "" : myObj.ToString();
Run Code Online (Sandbox Code Playgroud)

无论如何都是黑客攻击.我认为这是清晰代码的一个很好的例子.你想要达到的目标是绝对明显的,并且你期望无效.

更新:

我现在看到你并不是说这是一个黑客.但是,你认为这种方式不是要走的问题.在我看来,它绝对是最清晰的解决方案.

  • -1因为它没有回答这个问题. (2认同)