检查空值的函数结果值
在他的回答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) {}
。我知道我不能,但是这将是理想的。
BlackBear的解决方案工作完全正常,因为它是:
string y = (GetMyObject() ?? "none").ToString();
这将要么设置y
到GetMyObject().ToString()
(如果GetMyObject()
返回一个非空引用),否则返回"none".ToString()
。在字符串上有一个很小的命中ToString()
,但我非常怀疑它是重要的。
那很好,如果GetMyObject()
回报object
。如果它返回string
不能将转换成的一些特定类型,只是将其中的一个转换为object
,例如,
string y = (GetMyButton() ?? (object) "none").ToString();
话虽如此,我可能会在那时使用扩展方法 - 或者只是简单地做。
将其转换为对象作品。我几乎总是喜欢更长的形式,但很高兴知道它可以在一行上完成。谢谢! – Bobson 2012-03-23 21:05:10
它看起来像你想使用空安全的对其操作,写成?.
在某些语言中:
var x = GetMyObject()?.ToString() ?? "none";
不幸的是C#没有这个操作符。你可以按照你已经做到的方式来做。
此运算符considered对于除了语言。但是它并没有进入任何发布的C#版本。
缺少了什么代码可以[通常]加入:
private static object SafeToString(object obj, string defaultString = "none")
{
return obj != null ? obj.ToString() : defaultString;
}
使用此方法的对象扩展隐藏空值时的注意事项。如果过度使用,实际上可以隐藏错误并导致更多/错误的代码。我喜欢使用扩展名,在使用这种扩展名时请记住这一点。 – 2012-03-23 19:48:15
你已经自己回答了你的问题 – sll 2012-03-23 19:35:00
没有看到GetMyObject(),听起来像你在正确的轨道上。你必须在某个时候将MyObject带入记忆中,这样做没有意义。 – 2012-03-23 19:36:54
嗯......用什么类型的对象执行'string y =(Session [“key”] ??“none”)。ToString()'* not * work? – 2012-03-23 19:37:07