有没有一种简单的方法可以执行以下操作:
String s = myObj == null ? "" : myObj.ToString();
我知道我可以执行以下操作,但我确实将其视为黑客:
String s = "" + myObj;
如果Convert.ToString()为此具有适当的重载,那就太好了。
有没有一种简单的方法可以执行以下操作:
String s = myObj == null ? "" : myObj.ToString();
我知道我可以执行以下操作,但我确实将其视为黑客:
String s = "" + myObj;
如果Convert.ToString()为此具有适当的重载,那就太好了。
Answers:
C#6.0编辑:
使用C#6.0,我们现在可以使用简洁,免转换的原始方法版本:
string s = myObj?.ToString() ?? "";
甚至使用插值:
string s = $"{myObj}";
原始答案:
String s = (myObj ?? String.Empty).ToString();
要么
String s = (myObjc ?? "").ToString()
更简洁。
不幸的是,正如已经指出的那样,您通常需要在任一侧进行强制转换才能使此类型适用于非String或Object类型:
String s = (myObjc ?? (Object)"").ToString()
String s = ((Object)myObjc ?? "").ToString()
因此,尽管看起来很优雅,但演员表几乎总是必需的,在实践中并不是那么简洁。
如在其他地方建议的那样,我建议也许使用扩展方法来使它更干净:
public static string ToStringNullSafe(this object value)
{
return (value ?? string.Empty).ToString();
}
string.Format("{0}", myObj);
string.Format将把null格式化为空字符串,并在非null对象上调用ToString()。据我了解,这就是您想要的。
"" + myObj
。但我读过会创建额外的字符串。 str.Concat(myObj)
似乎工作正常,并且“甚至更快”。
如果Convert.ToString()为此具有适当的重载,那就太好了。
还有的是一个Convert.ToString(Object value)
因为NET 2.0(大约5年前这个问答有人问。),这似乎做的正是你想要的东西:
http://msdn.microsoft.com/zh-CN/library/astxcyeh(v=vs.80).aspx
我是否想念/误解了这里确实很明显的东西?
使用扩展方法,您可以完成此操作:
public static class Extension
{
public static string ToStringOrEmpty(this Object value)
{
return value == null ? "" : value.ToString();
}
}
以下内容不会在屏幕上写入任何内容,也不会引发异常:
string value = null;
Console.WriteLine(value.ToStringOrEmpty());
string s = "" + myObj;
是骇人听闻的,则在空对象上调用函数应该属于同一条船。我会对此表示反对,但是它确实解决了手头的问题,我只是不同意用法。空对象应该抛出NullReferenceException
,即使在扩展方法中也是如此。
ToStringOrEmptyWhenNull
。
this
参数)时不会抛出异常,因为它们只是语法糖。也就是说x.SomeExtensionMethod()
是语法糖SomeStaticClass.SomeExtensionMethod(x);
因此,当x
是null
我们不试图调用一个方法null
的对象,而是传递一个null
对象的静态方法。当且仅当该方法检查null
参数并在遇到这种情况时抛出时,扩展方法才会在null
对象抛出时“调用” 。
我不同意这一点:
String s = myObj == null ? "" : myObj.ToString();
无论如何都是黑客。我认为这是清晰代码的一个很好的例子。显然,您想要实现什么,并且期望得到null。
更新:
我现在知道您不是在说这是黑客。但这是一个隐含的问题,您认为这种方式并非可行之路。在我看来,这绝对是最清晰的解决方案。
string s = String.Concat(myObj);
我猜这将是最短的方法,而且性能开销也很微不足道。请记住,尽管对于代码阅读者来说,目的不是很清楚。
Concat
是不一样的- 实际上在下面进行了空检查并返回string.Empty
or arg0.ToString()
,这似乎表现得更好(我的意思是,我们在这里说的是ms)。
其实我不明白你想做什么。据我了解,您可以使用其他方式编写此代码。你在问这个吗?你能解释更多吗?
string s = string.Empty;
if(!string.IsNullOrEmpty(myObj))
{
s = myObj.ToString();
}
string s = string.IsNullOrEmpty(myObj) ? string.Empty : myObj.ToString();
我的答案可能会被打败,但是无论如何,这仍然可行:
我会简单地写
字符串s =“” if(myObj!= null){x = myObj.toString(); }
使用三元运算符在性能方面是否有回报?我不知道我的头顶。
显然,正如上面提到的,您可以将此行为放入诸如safeString(myObj)之类的允许重用的方法中。
一些(速度)性能测试总结了各种选择,而不是#microoptimization(使用linqpad扩展名)确实很重要
void Main()
{
object objValue = null;
test(objValue);
string strValue = null;
test(strValue);
}
// Define other methods and classes here
void test(string value) {
new Perf<string> {
{ "coallesce", n => (value ?? string.Empty).ToString() },
{ "nullcheck", n => value == null ? string.Empty : value.ToString() },
{ "str.Format", n => string.Format("{0}", value) },
{ "str.Concat", n => string.Concat(value) },
{ "string +", n => "" + value },
{ "Convert", n => Convert.ToString(value) },
}.Vs();
}
void test(object value) {
new Perf<string> {
{ "coallesce", n => (value ?? string.Empty).ToString() },
{ "nullcheck", n => value == null ? string.Empty : value.ToString() },
{ "str.Format", n => string.Format("{0}", value) },
{ "str.Concat", n => string.Concat(value) },
{ "string +", n => "" + value },
{ "Convert", n => Convert.ToString(value) },
}.Vs();
}
指出这一点可能很重要,Convert.ToString(...)
它将保留一个空字符串。
Holstebroe的评论将是您最好的答案:
string s = string.Format("{0}", myObj);
如果myObj
为null,格式将在此处放置一个空字符串值。
它还满足您的一条线要求,并且易于阅读。
即使这是一个古老的问题,并且OP要求使用C#,我还是想为那些使用VB.Net而不是C#的人共享一个VB.Net解决方案:
Dim myObj As Object = Nothing
Dim s As String = If(myObj, "").ToString()
myObj = 42
s = If(myObj, "").ToString()
不幸的是,VB.Net不允许在变量后使用?运算符,因此myObj?.ToString无效(至少在用于测试解决方案的.Net 4.5中无效)。相反,如果myObj ist Nothing,我使用If返回一个空字符串。因此,第一个Tostring-Call返回一个空字符串,而第二个(其中myObj不是Nothing)返回“ 42”。