【发布时间】:2012-04-08 09:07:55
【问题描述】:
BlackBear 在回复this question 时建议更换
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) {}。我知道我不能,但那将是理想的。
【问题讨论】:
-
你自己回答了你的问题
-
没有看到 GetMyObject(),听起来你是在正确的轨道上。您必须在某些时候将 MyObject 带入内存,这样做两次没有意义。
-
嗯...
string y = (Session["key"] ?? "none").ToString()不适用于什么类型的对象? -
顺便说一句,特别是如果您可以控制代码,您可能会对null object pattern 感兴趣。
标签: c# .net null-coalescing-operator