我需要一个非常简单的例子来了解我自己的事件。我很难理解互联网或书籍中可用的例子。c#.net中委托事件的超级简单示例?
6
A
回答
7
这是一个暴露事件的类的简单实现。
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
,它在Number
属性上运行set
方法,value = 10
。但num
成员的价值已经为10
,所以最初的条件评估为假,没有任何反应。
然后我们用20
做同样的事情。这一次的价值是不同的,所以我们将新值分配给num
并且触发事件。首先我们验证事件不是null。如果没有订阅它,它是空的。如果它不为空(例如是订阅它),我们使用标准方法/委托语法来启动它。我们只是用事件的参数来调用事件。这将调用订阅了该事件的所有方法,包括将执行Console.WriteLine()
的lambda。
亨里克已经成功nitpicked存在,如果一个线程可以在Number
的制定者,而另一个线程正在退订的听众的潜在的竞争条件。我不认为有人常见的情况下,谁还不明白事件是如何工作的,但如果你担心这种可能性,修改这些行:
if (this.NumberChanged != null)
this.NumberChanged(this, EventArgs.Empty);
是这样的:
var tmp = this.NumberChanged;
if (tmp != null)
tmp(this, EventArgs.Empty);
0
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);
}
}
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");
};
}
相关问题
- 1. 事件委托在C++中
- 2. .net UIAutomation C++中的简单示例
- 3. 在c#.net中使用委托的示例
- 4. 超级简单绑定示例
- 5. C#委托和事件
- 6. .NET 4.0和C#4.0中的事件和委托反转现象
- 7. UserControl中的C#委托和事件
- 8. 委托事件
- 9. .NET委托用于事件吗?
- 10. C#.NET 4.5异步委托
- 11. 委托,事件惯例,我不明白
- 12. 使用简单委托
- 13. C#委托事件不好的做法?
- 14. C#委托实例化
- 15. Vimeo onFinish事件的简单示例
- 16. 如何向托管C++ 2010中的事件添加委托?
- 17. 关于C#委托/事件处理
- 18. C#委托事件处理程序SelectedIndexChanged
- 19. C#事件+ =委托{}相当于在VB.NET
- 20. C#委托与事件处理程序
- 21. jQuery的:委托事件
- 22. jQuery的委托()/上() - 事件
- 23. mysql_query()事务简单示例
- 24. 简单的C++ hash_set示例
- 25. Qt委托QTreeView的模块,只委托非顶级小部件?
- 26. 统一委托事件
- 27. 当委托事件与GWT
- 28. FormClosing委托事件问题
- 29. 创建委托事件
- 30. iphone检测委托事件
谢谢格雷格。我期待着这样的答案。 – Babu
!= null --line上的竞争条件,因为NumberChanged可以被另一个线程取消订阅,如果你有更多的话。 – Henrik
+1为所有信息。对不起,我是软件开发新手,但是如何编辑3行与上面的2行代码不同,后面3行代码中的“this”是指什么以及它如何解决线程问题?请你能详细说明一下吗?谢谢! –