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

有没有一个简单的方法来做到以下几点:

String s = myObj == null ? "" : myObj.ToString(); 

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

 String s = "" + myObj; 

如果Convert.ToString()有适当的重载,这将是很好的。

C#6.0编辑:

在C#6.0中,我们现在可以有一个简洁的,无投弃决的方法:

 string s = myObj?.ToString() ?? ""; 

甚至:

 string s = $"{myObj}"; 

原始答案:

 String s = (myObj ?? String.Empty).ToString(); 

要么

 String s = (myObjc ?? "").ToString() 

更加简洁。

不幸的是,正如你已经指出的那样,你经常需要在任何一边进行强制转换来使这个工作使用非String或Objecttypes:

 String s = (myObjc ?? (Object)"").ToString() String s = ((Object)myObjc ?? "").ToString() 

因此,虽然看起来优雅,但演员几乎总是必要的,在实践中并不是那么简洁。

正如其他地方所build议的那样,我build议可以使用扩展方法来使这个更清洁:

 public static string ToStringNullSafe(this object value) { return (value ?? string.Empty).ToString(); } 
 string.Format("{0}", myObj); 

string.Format将格式化null作为空string,并在非null对象上调用ToString()。 据我了解,这是你在找什么。

用扩展方法,你可以做到这一点:

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

以下内容不会写入任何内容,也不会抛出exception:

  string value = null; Console.WriteLine(value.ToStringOrEmpty()); 

如果Convert.ToString()有适当的重载,这将是很好的。

自从.Net 2.0(在问Q之前大约5年Convert.ToString(Object value)以来,一直存在一个Convert.ToString(Object value) ),它看起来完全符合你的要求:

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

我是否错过/误解这里真正明显的东西?

我不同意这个:

 String s = myObj == null ? "" : myObj.ToString(); 

是任何方式的黑客。 我认为这是一个清晰的代码的好例子。 这是显而易见的,你想达到什么,你期望空。

更新:

我现在看到你不是说这是一个黑客。 但是,这个问题暗示着你认为这种方式不行。 在我看来,这绝对是最明智的解决scheme。

 string s = String.Concat(myObj); 

将是我猜测的最短的方式,也有可以忽略的性能开销。 请记住,虽然代码的读者不明确的目的是什么。

其实我不明白你想做什么。 据我所知,你可以用这种方式写这个代码。 你在问这个吗? 你能解释一下吗?

 string s = string.Empty; if(!string.IsNullOrEmpty(myObj)) { s = myObj.ToString(); } 

霍尔斯特布罗的评论将是你最好的答案:

 string s = string.Format("{0}", myObj); 

如果myObj为null,Format将在此处放置一个空string值。

它也满足您的一条线要求,易于阅读。

我可能会得到我的答案殴打,但无论如何,

我只会写

string(s)=“”if(myObj!= null){x = myObj.toString(); }

使用三元运算符的性能是否有回报? 我不知道我的头顶。

显然,正如上面提到的那样,你可以把这个行为放到允许重用的safeString(myObj)之类的方法中。

我有同样的问题,并通过简单地将对象转换为string来解决它。 这也适用于空对象,因为string可以是空值。 除非你绝对不想有一个空string,这应该工作得很好:

 string myStr = (string)myObj; // string in a object disguise or a null