gpt4 book ai didi

c# - 如何在 C# 中调度事件

转载 作者:IT王子 更新时间:2023-10-29 04:40:57 25 4
gpt4 key购买 nike

我希望创建自己的事件并发送它们。我以前从未在 C# 中这样做过,只在 Flex 中这样做过。我想一定有很多不同之处。

谁能给我一个很好的例子?

最佳答案

有一种模式在所有库类中都使用。它也被推荐用于您自己的类,尤其是对于框架/库代码。但是当你偏离或跳过几步时,没有人会阻止你。

这是基于最简单的事件委托(delegate) System.Eventhandler 的示意图。

// The delegate type. This one is already defined in the library, in the System namespace
// the `void (object, EventArgs)` signature is also the recommended pattern
public delegate void Eventhandler(object sender, Eventargs args);

// your publishing class
class Foo
{
public event EventHandler Changed; // the Event

protected virtual void OnChanged() // the Trigger method, called to raise the event
{
// make a copy to be more thread-safe
EventHandler handler = Changed;

if (handler != null)
{
// invoke the subscribed event-handler(s)
handler(this, EventArgs.Empty);
}
}

// an example of raising the event
void SomeMethod()
{
if (...) // on some condition
OnChanged(); // raise the event
}
}

以及如何使用它:

// your subscribing class
class Bar
{
public Bar()
{
Foo f = new Foo();
f.Changed += Foo_Changed; // Subscribe, using the short notation
}

// the handler must conform to the signature
void Foo_Changed(object sender, EventArgs args) // the Handler (reacts)
{
// the things Bar has to do when Foo changes
}
}

当你有信息要传递时:

class MyEventArgs : EventArgs    // guideline: derive from EventArgs
{
public string Info { get; set; }
}

class Foo
{
public event EventHandler<MyEventArgs> Changed; // the Event
...
protected virtual void OnChanged(string info) // the Trigger
{
EventHandler handler = Changed; // make a copy to be more thread-safe
if (handler != null)
{
var args = new MyEventArgs(){Info = info}; // this part will vary
handler(this, args);
}
}
}

class Bar
{
void Foo_Changed(object sender, MyEventArgs args) // the Handler
{
string s = args.Info;
...
}
}

更新

从 C# 6 开始,'Trigger' 方法中的调用代码变得容易得多,可以使用 null 条件运算符 ?. 缩短 null 测试,而无需在保持线程的情况下进行复制-安全:

protected virtual void OnChanged(string info)   // the Trigger
{
var args = new MyEventArgs{Info = info}; // this part will vary
Changed?.Invoke(this, args);
}

关于c# - 如何在 C# 中调度事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2448487/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com