检查空值的函数结果值

问题描述:

在他的回答this question,BlackBear建议用检查空值的函数结果值

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

这个伟大的工程更换

string y = Session["key"] == null ? "none" : Session["key"].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 y = GetMyObject().ToString() ?? "none"; 

即使GetMyObject()为空就了事。基本上空合并运算符充当一个自包含try {} catch (NullReferenceException) {}。我知道我不能,但是这将是理想的。

+2

你已经自己回答了你的问题 – sll 2012-03-23 19:35:00

+0

没有看到GetMyObject(),听起来像你在正确的轨道上。你必须在某个时候将MyObject带入记忆中,这样做没有意义。 – 2012-03-23 19:36:54

+4

嗯......用什么类型的对象执行'string y =(Session [“key”] ??“none”)。ToString()'* not * work? – 2012-03-23 19:37:07

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

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

这将要么设置yGetMyObject().ToString()(如果GetMyObject()返回一个非空引用),否则返回"none".ToString()。在字符串上有一个很小的命中ToString(),但我非常怀疑它是重要的。

那很好,如果GetMyObject()回报object。如果它返回string不能将转换成的一些特定类型,只是将其中的一个转换为object,例如,

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

话虽如此,我可能会在那时使用扩展方法 - 或者只是简单地做。

+0

将其转换为对象作品。我几乎总是喜欢更长的形式,但很高兴知道它可以在一行上完成。谢谢! – Bobson 2012-03-23 21:05:10

它看起来像你想使用空安全的对其操作,写成?.在某些语言中:

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

不幸的是C#没有这个操作符。你可以按照你已经做到的方式来做。

此运算符considered对于除了语言。但是它并没有进入任何发布的C#版本。

+2

从来没有听说过这样的一个,请问您能否从其他语言中引入一些示例? – sll 2012-03-23 19:35:48

+0

有趣的知道,谢谢! – sll 2012-03-23 20:07:15

+0

是的,那是我正在寻找的那种操作员。很高兴知道它不存在。如果我有投票权,那肯定会有我的投票权。 – Bobson 2012-03-23 21:03:58

缺少了什么代码可以[通常]加入:

private static object SafeToString(object obj, string defaultString = "none") 
{ 
    return obj != null ? obj.ToString() : defaultString; 
} 
+0

使用此方法的对象扩展隐藏空值时的注意事项。如果过度使用,实际上可以隐藏错误并导致更多/错误的代码。我喜欢使用扩展名,在使用这种扩展名时请记住这一点。 – 2012-03-23 19:48:15