如何做一个可能为空对象的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