【问题标题】:Automated null checks [duplicate]自动空值检查 [重复]
【发布时间】:2013-12-06 14:20:39
【问题描述】:

供应商通常会为我提供庞大、超大的代理类来传递信息。很多时候,为了获得消息的实际内容,我必须进入这样的属性:

var priceOfEggs = BeingItself.PossibleUniverses.Universe[0].Galaxies.Galaxy[0].Systems.System[0].[...].LocalEconomy[0].PriceOfEggs;

事实证明,这个 WCF 衍生品中的所有这些类都只有一个对象可以容纳任何东西(它会造成事物井井有条的错觉,你看)。

问题是这些类中的任何一个都可能包含 null,我得到一个异常。

这里的防御性编码是禁止的。空值检查会导致代码嵌套很深。数组的坏处是数组的两倍,因为我必须检查 null,然后检查 count > 0。有时我必须遍历数组。

我可以尝试/捕捉,但很难知道它在生产中的什么地方,因为它不在我的调试器中。

有没有办法通过 Trace 显示哪个类为空?

有没有一种方法可以安全地取消对这个怪物的叶节点的引用,而不会造成软件冗长的丛林?

编辑:感谢把链接放在上面的人!这基本上是我通过谷歌搜索找不到的问题。

【问题讨论】:

标签: c# wcf nullreferenceexception proxy-classes defensive-programming


【解决方案1】:

DataContracts 是作为没有构造函数的部分类生成的。您可以为每个数据协定创建一个新的部分类,并在其构造函数中将属性初始化为新对象或集合:

public partial class BeingItself
{
    public BeingItself()
    {
        this.PossibleUniverses = new List<Universe>();
    }
}

仍然不能盲目地“点入”集合,因为它是空的,PossibleUniverses[0] 将不存在。在那里你仍然需要进行检查。

【讨论】:

  • 但是,如果对象是从外部系统的 XML 或 JSON 创建的,那么您将永远无法确定所有属性都已正确初始化。那是OP的问题。还是我错过了什么?
  • @Charlie 当 WCF 反序列化消息时,它会调用对象的构造函数。当消息明确包含属性的null 时,您是对的,之后确实会是null,导致OP 仍然需要检查。
  • 啊,我明白了。这就说得通了。感谢您的澄清!
猜你喜欢
  • 2017-04-20
  • 2013-05-11
  • 2013-09-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多