如何访问非完全构造的对象?
How to access non fully constructed objects?
我有一个 class 为构造函数执行一个操作,比方说 class A.
public class A
{
public A(Action action) {...}
}
然后我实例化它。
class Program
{
void Main()
{
A a = new A(() => { DoSomethingWith(x); });
}
}
问题是:如何在我的操作中引用 'a'?换句话说,如何用 'a' 替换 'x'?
我试过 'this' 关键字,但它指的是 Program.
顺便说一句,我不能为我的构造函数使用其他输入,因为这个项目中的动作非常随机。
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
完全构建之前捕获它。
虽然这似乎是一个 X-Y 问题,但我会尽可能避免这样做,因为很难判断 DoSomething
之前是否使用完全初始化的 A
该操作被调用,这会使您的对象处于不确定状态。有用途,小心就好
如前所述,您不能在构造函数中分配操作,因为 a
尚未构造。不要混淆 分配 动作与 运行 分配 它。您可能希望 运行 与创建 a
的时间不同。
不一定要宽恕这种方法(它有点丑陋,可能有更好的方法来实现你的目的),你可以做这样的事情:
public class A
{
Action<A> MyAction
public A(Action<A> action)
{
MyAction = action;
}
public void DoMyAction()
{
MyAction(this);
}
}
class Program
{
void Main()
{
var a = new A((x) => { DoSomethingWith(x); });
a.DoMyAction();
}
}
我有一个 class 为构造函数执行一个操作,比方说 class A.
public class A
{
public A(Action action) {...}
}
然后我实例化它。
class Program
{
void Main()
{
A a = new A(() => { DoSomethingWith(x); });
}
}
问题是:如何在我的操作中引用 'a'?换句话说,如何用 'a' 替换 'x'?
我试过 'this' 关键字,但它指的是 Program.
顺便说一句,我不能为我的构造函数使用其他输入,因为这个项目中的动作非常随机。
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
完全构建之前捕获它。
虽然这似乎是一个 X-Y 问题,但我会尽可能避免这样做,因为很难判断 DoSomething
之前是否使用完全初始化的 A
该操作被调用,这会使您的对象处于不确定状态。有用途,小心就好
如前所述,您不能在构造函数中分配操作,因为 a
尚未构造。不要混淆 分配 动作与 运行 分配 它。您可能希望 运行 与创建 a
的时间不同。
不一定要宽恕这种方法(它有点丑陋,可能有更好的方法来实现你的目的),你可以做这样的事情:
public class A
{
Action<A> MyAction
public A(Action<A> action)
{
MyAction = action;
}
public void DoMyAction()
{
MyAction(this);
}
}
class Program
{
void Main()
{
var a = new A((x) => { DoSomethingWith(x); });
a.DoMyAction();
}
}