我想创建事件操作,以便在发生事情时通知其他类。所以我现在的流量是这样的
出于测试目的,我创建了以下代码
Program.cs
实例化第一个类并从它调用一个方法(构造函数很好)。
internal class Program
{
private static void Main(string[] args)
{
First f = new First();
}
}
First.cs
实例化第二个类并从它调用一个方法(构造函数很好)。当某些数据发生更改时,侦听第二类的事件。
internal class First
{
public First()
{
// ...
Second s = new Second();
s.Updated += OnSecondUpdated;
}
private void OnSecondUpdated()
{
Console.WriteLine("Done");
Console.ReadLine();
}
}
Second.cs
实例化第三个类并从它调用一个方法(构造函数很好)。当某些数据发生更改时,侦听第三类的事件,并引发自己的事件。
internal class Second
{
public event Action Updated;
public Second()
{
// ...
Third t = new Third();
t.Updated += OnThirdUpdated;
}
private void OnThirdUpdated()
{
// ...
Updated();
}
}
Third.cs在某些数据更改时引发事件。
internal class Third
{
public event Action Updated;
public Third()
{
// ...
Updated();
}
}
不幸的是,事件变量为null。如何正确实例化这些变量?
发布于 2019-05-10 00:19:14
这里的问题是,您正在构造函数中尝试这样做,在构造函数中,还没有(尚未)分配给Updated
事件。您可以通过检查null来“解决”这个问题:
internal class Third
{
public event Action Updated;
public Third()
{
// ...
if(Updated != null)
Updated();
}
}
但这并不意味着您的代码现在“工作”,因为您只在调用构造函数之后为事件分配一个处理程序:
Third t = new Third();
t.Updated += OnThirdUpdated;
因此,这种模式的一个可能的解决方案是不要在构造函数中引发事件,而是将逻辑推迟到另一个方法。
internal class Third
{
public event Action Updated;
public Third()
{
}
public void Init()
{
// ...
if(Updated != null)
Updated();
}
}
Third t = new Third();
t.Updated += OnThirdUpdated;
t.Init();
发布于 2019-05-10 00:28:23
在类可以订阅事件之前调用Update()
,这是因为首先调用底层对象的构造函数。我更改了它,以便构造函数接受相关的类并订阅事件本身。
internal class First
{
public First()
{
Second s = new Second(this);
}
internal void OnSecondUpdated()
{
Console.WriteLine("Done");
Console.ReadLine();
}
}
internal class Second
{
public event Action Updated;
public Second(First f)
{
Updated += f.OnSecondUpdated;
Third t = new Third(this);
}
internal void OnThirdUpdated()
{
Updated();
}
}
internal class Third
{
public event Action Updated;
public Third(Second s)
{
Updated += s.OnThirdUpdated;
Updated();
}
}
https://stackoverflow.com/questions/56073272
复制相似问题