【问题标题】:Checking a function result for null values检查空值的函数结果
【发布时间】: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


【解决方案1】:

BlackBear 的解决方案可以正常工作:

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

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

如果GetMyObject() 返回object,那很好。如果它返回string 无法 转换为的特定类型,只需将其中一个转换为object,例如

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

话虽如此,我可能会在那时使用扩展方法 - 或者直接使用。

【讨论】:

  • 将其转换为对象作品。我几乎总是更喜欢较长的形式,但很高兴知道它可以在一行中完成。谢谢!
【解决方案2】:

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

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

【讨论】:

  • 谨慎使用这种隐藏空值的对象扩展方法。如果过度使用,您实际上可以隐藏错误并导致更多/错误的代码。我喜欢扩展程序,在使用这样的扩展程序时请记住这一点。
【解决方案3】:

您似乎想使用空安全解引用运算符,在某些语言中写为 ?.

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

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

这个运算符是considered 用于添加到语言中。但是它并没有进入任何已发布的 C# 版本。

【讨论】:

  • 从来没有听说过这样的,你能举一些其他语言的例子吗?
  • 是的,这就是我正在寻找的那种运算符。很高兴知道它不存在。如果我投票的话,我肯定会投票赞成。
猜你喜欢
  • 1970-01-01
  • 2017-04-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多