稍后使用循环引用初始化对象会包含NullReferenceException

时间:2016-05-11 16:30:50

标签: c# nullreferenceexception params

无论如何,我的代码看起来像这样:

        SystemOutput systemOutput = null;
        SystemCL system = null;
        WindowsForm wf = null;

        wf = new WindowsForm(system);
        systemOutput = new SystemOutput(wf);
        system = new SystemCL(systemOutput, wf);

其余的代码对于解决我的问题并不重要(我想?)

因为您可以看到对象相互引用,这意味着如果其他对象尚未初始化,则会给我一个错误。所以我首先尝试将它们设为null,但现在第一个对象获得nullreferencepointer,因为该对象为null。

如何解决这个难题?有更好的方法吗?

注意What is a NullReferenceException, and how do I fix it?不包括这种情况。

2 个答案:

答案 0 :(得分:1)

答案是首先不创造谜题。不要创建循环引用,例如WindowsForm取决于SystemCLSystemOutput取决于WindowsForm,然后SystemCL取决于它们。

不要将它视为如何使这些类按照设计工作的难题。难题是如何以不同的方式设计它们,以便它们不会以这种方式相互依赖。

在不知道课程实际做什么的情况下,我可以得到详细信息。

面向对象编程的大多数复杂性决定了类将如何依赖于其他类。或者,如果您正在处理其他人的代码,那么它会确定哪些类依赖于其他类。实现这一目标是IMO OOP最重要的方面之一。

我认为当一个类依赖于另一个类时,将对象传递给其他对象的构造函数是正确的。这是一个很好的做法。下一步是找出每个类中的属性,这样它们就不需要循环地相互依赖。

答案 1 :(得分:0)

首先 - 最好重新设计类以避免循环引用。请参阅https://softwareengineering.stackexchange.com/questions/11856/whats-wrong-with-circular-references进行讨论。

如果必须有这样的引用(即具有父/子关系的构建树),则其中一个对象必须提供延迟设置其中一个关系引用的方法。

最简单 - 公开属性并在构造其他对象后稍后设置:

    wf = new WindowsForm(/*nothing*/);
    systemOutput = new SystemOutput(wf);
    system = new SystemCL(systemOutput, wf);
    wf.SetSystem(system); // method to make it less tempting to set later

还有多种方法可以使它更安全(工厂,添加时构建对象,......),甚至包括immutable trees