1

在回答这个问题时,BlackBear 建议替换

 string y = Session["key"] == null ? "none" : Session["key"].ToString();

 string y = (Session["key"] ?? "none").ToString();

如果是一个字符串值,这很好Session["key"]用,但是如果我想对一个对象执行此操作呢?例如,我可以这样做:

 string y = GetMyObject() == null ? "none" : GetMyObject().ToString();

但是,如果我不想评估GetMyObject()两次怎么办?我唯一的选择是将结果存储在变量中,然后检查该变量是否为空吗?

 var x = GetMyObject();
 string y = (x == null) ? "none" : x.ToString();

编辑:这都是理论上的——我以前遇到过,但我现在没有一个具体的例子。话虽如此,这是一个示例类。

class MyObject
{
   private MyObject() { }
   public MyObject GetMyObject() { return new MyObject(); }
   public override string ToString() { return "A String"; }
}

如果我这样做string y = (GetMyObject() ?? "none").ToString();,我会得到

操作员 '??' 不能应用于“MyObject”和“string”类型的操作数”。

理想情况下,我可以做到

 string y = GetMyObject().ToString() ?? "none";

即使 GetMyObject() 为空,它也能正常工作。基本上空合并运算符充当自包含的try {} catch (NullReferenceException) {}. 我知道我不能,但那将是理想的。

4

3 回答 3

4

BlackBear 的解决方案可以正常工作,因为它是:

string y = (GetMyObject() ?? "none").ToString();

That will either set y to GetMyObject().ToString() (if GetMyObject() returns a non-null reference) or to "none".ToString() otherwise. There's a tiny, tiny hit calling ToString() on a string, but I'd very much doubt that it's significant.

That's fine if GetMyObject() returns object. If it returns some specific type which string can't be converted to, just cast one of them to object, e.g.

string y = (GetMyButton() ?? (object) "none").ToString();

Having said that, I'd probably use an extension method at that point - or just do it longhand.

于 2012-03-23T19:43:44.580 回答
2

看起来您想使用?.以某些语言编写的 null 安全解引用运算符:

var x = GetMyObject()?.ToString() ?? "none";

不幸的是,C# 没有这个运算符。你可以按照你已经在做的方式去做。

考虑将此运算符添加到语言中。然而,它并没有进入任何已发布的 C# 版本。

于 2012-03-23T19:34:34.693 回答
0

[通常] 可以添加代码中缺少的内容:

private static object SafeToString( object obj, string defaultString = "none" )
{
    return obj != null ? obj.ToString() : defaultString;
}
于 2012-03-23T19:40:29.277 回答