【问题标题】:How to reference an object that hasn't yet been instantiated如何引用尚未实例化的对象
【发布时间】:2014-04-28 23:22:59
【问题描述】:

我正在尝试用 C# 为流程图建模。我将稍微简化一下类,但基本思想是给定的Step 指向另一个Step。我想要做的是在代码中的一个地方建立所有东西之间的联系。例如,我希望 step1 指向 step2 指向 step3

class Step
{
   Step nextStep;

   // Constructor
   public Step(Step nextStep) { this.nextStep = nextStep; }
}

class Chart
{
    private readonly Step step1;
    private readonly Step step2;
    private readonly Step step3;

    public Chart()
    {
        step1 = new Step(step2);
        step2 = new Step(step3);
        step3 = new Step(null);
    }
}

static void main()
{
   Chart myChart = new Chart();
}

这编译得很好,但是如果 nextStep 对象还没有被实例化,那么在实例化时引用就会丢失。

在本例中,step1 的构造函数传递给 step2,此时为 null。我希望当step2 被实例化时,step1 中的引用会正确地指向新创建的step2,但事实并非如此。

看起来我需要先实例化所有对象,然后返回并通过 setter 或其他方式设置链接。这是正确的方法吗?或者可以像我尝试的那样在构造函数中完成吗?

【问题讨论】:

  • 我很惊讶这个编译因为你在实例化 step1 时使用了一个未初始化的变量(step2)
  • 它没有为我编译... ------ 构建开始:项目:ConsoleApplication3,配置:调试 x86 ------ D:\Projects\Test\Console\ ConsoleApplication3\ConsoleApplication3\Program.cs(22,30):错误 CS0165:使用未分配的局部变量 'step2' D:\Projects\Test\Console\ConsoleApplication3\ConsoleApplication3\Program.cs(23,30):错误 CS0165:使用未分配的局部变量“step3”
  • @Mick - 抱歉。我试图将其归结为简化,但略有不同。我将修改我的代码示例。

标签: c# instantiation


【解决方案1】:

您可能需要向后工作:首先是step3,然后是step2,在其构造函数中寻址step3,等等。

【讨论】:

    【解决方案2】:

    您需要创建一个不指向其他任何东西的实际对象。

    step3 = new Step(null);
    

    从那里,以相反的顺序设置您的步骤,直到您到达第一步。

    step2 = new Step(step3);
    step1 = new Step(step2);
    

    【讨论】:

    • 我会解决这个问题,因为它可能会造成混淆,但问题在于 step1 和 step2。他们将始终将 nextStep 设置为 null。
    【解决方案3】:

    如果您想在构造函数中执行此操作,则必须首先创建对象。使用依赖注入的一种方法是传入父级并将新步骤分配为父级的下一步。

    例子:

    class Step
    {
        private Step nextStep;
    
        public Step() {}
    
        public Step(Step parent)
        {
            parent.nextStep = this;
        }
    }
    
    static void main()
    {
        Step step1, step2, step3;
    
        step1 = new Step();
        step2 = new Step(step1);
        step3 = new Step(step2);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-15
      • 1970-01-01
      • 2022-01-17
      • 2020-01-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多