我需要一个非常简单的例子来了解这些事件。我感觉很难理解互联网或书籍中可用的例子。
答案 0 :(得分:6)
这是一个公开事件的类的简单实现。
public class ChangeNotifier
{
// Local data
private int num;
// Ctor to assign data
public ChangeNotifier(int number) { this.num = number; }
// The event that can be subscribed to
public event EventHandler NumberChanged;
public int Number
{
get { return this.num; }
set
{
// If the value has changed...
if (this.num != value)
{
// Assign the new value to private storage
this.num = value;
// And raise the event
if (this.NumberChanged != null)
this.NumberChanged(this, EventArgs.Empty);
}
}
}
}
这个类的用法如下:
public void SomeMethod()
{
ChangeNotifier notifier = new ChangeNotifier(10);
// Subscribe to the event and output the number when it fires.
notifier.NumberChanged += (s, e) => Console.Writeline(notifier.Number.ToString());
notifier.Number = 10; // Does nothing, this is the same value
notifier.Number = 20; // Outputs "20" because the event is raised and the lambda runs.
}
关于控制流程,执行流程为SomeMethod()
。我们创建一个新的ChangeNotifier
,从而调用它的构造函数。这会将10
的值分配给私人num
成员。
然后我们使用+=
语法订阅该事件。此运算符在右侧接受委托(在我们的示例中,该委托是lambda)并将其添加到事件的委托集合中。此操作不会执行我们在ChangeNotifier
中编写的任何代码。如果您愿意,可以通过活动的add
和remove
方法对其进行自定义,但很少需要这样做。
然后我们对Number
属性执行几个简单的操作。首先,我们分配10
,set
方法在Number
属性上运行value = 10
方法num
。但10
成员的值已经20
,因此初始条件的计算结果为false,没有任何反应。
然后我们对num
做同样的事情。这次值不同,因此我们将新值分配给Console.WriteLine()
并触发事件。首先,我们验证事件不是null。如果没有订阅它,它就为null。如果它不为null(即,如果某些 订阅了它),我们使用标准方法/委托语法来激活它。我们只需使用事件的参数调用事件。这将调用已订阅该事件的所有方法,包括将执行Number
的lambda。
如果一个线程可以在if (this.NumberChanged != null)
this.NumberChanged(this, EventArgs.Empty);
的setter中,而另一个线程取消订阅一个侦听器,那么Henrik已经成功地挑选了存在的潜在竞争条件。对于那些尚不了解事件如何运作的人来说,我不认为这是一个常见的案例,但是如果你担心这种可能性,请修改以下几行:
var tmp = this.NumberChanged;
if (tmp != null)
tmp(this, EventArgs.Empty);
是这样的:
{{1}}
答案 1 :(得分:2)
class Program
{
static void Main(string[] args)
{
Parent p = new Parent();
}
}
////////////////////////////////////////////
public delegate void DelegateName(string data);
class Child
{
public event DelegateName delegateName;
public void call()
{
delegateName("Narottam");
}
}
///////////////////////////////////////////
class Parent
{
public Parent()
{
Child c = new Child();
c.delegateName += new DelegateName(print);
//or like this
//c.delegateName += print;
c.call();
}
public void print(string name)
{
Console.WriteLine("yes we got the name : " + name);
}
}
答案 2 :(得分:1)
Class A {
public delegate void EventHandler();
public static event EventHandler workComplete();
void doWork(){
// DO WORK
}
void onWorkComplete(){
// Raise event
workComplete();
}
}
Class Main {
A a = new A();
a.workComplete += new () -> {
// On Class Complete Work
Console.WriteLine("Work Complete");
};
}
答案 3 :(得分:0)
如果你有C背景,你可以看到委托作为指向功能的指针。