如何访问非完全构造的对象?

时间:2018-03-13 00:55:43

标签: c# constructor action instantiation

我有一个类为构造函数执行Action,让我们说A类。

public class A
{
    public A(Action action) {...}
}

我实例化它。

class Program
{
    void Main()
    {
        A a = new A(() => { DoSomethingWith(x); });
    }
}

问题是:我如何参考' a'在我的行动?换句话说,我怎样才能取代' x'与' a'? 我试过这个'关键字,但它指的是程序 顺便说一句,我不能为我的构造函数使用其他输入,因为这个项目中的动作非常随机。

2 个答案:

答案 0 :(得分:1)

在构造函数运行之前,

a尚未完全构造。这意味着此时Action代表内部无法使用它。如果需要,您可以创建不同类型的Action委托:

public class A
{
    public A(Action<A> myAction)
    {
        myAction(this);
    }
}

public class B
{
    public B()
    {
        var myA = new A((a) => { DoSomethingWithA(a); });
    }

    public void DoSomethingWithA(A a)
    {

    }
}

这允许它自己作为参数调用。直线Action不起作用,因为在完全构造之前无法捕获a

这似乎确实是一个XY问题,如果可能的话我会避免这样做,因为在调用操作之前很难判断DoSomething是否正在使用完全初始化的A,可以使您的对象处于未确定状态。有用处,请小心。

答案 1 :(得分:0)

正如所指出的,您无法在构造函数中分配操作,因为尚未构造def err! instance.name = 'erroring instance' raise VeryBad::NotCool if instance.save! end 。不要将分配操作与运行混淆。您可能希望在创建a时的不同时间运行操作。

没有必要纵容这种方法(它有点难看,而且可能有更好的方法来达到目的),你可以这样做:

a