在回答这个问题时,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) {}
. 我知道我不能,但那将是理想的。