c# – 多播委托和事件
我正在研究代表们.几天前,我为多播代表做了一个示例,并在这里查看了
My previous question,并清楚地了解了多播委托.
但现在我尝试用事件做多播委托样本.但在做样品时我有些疑惑.在上面的链接中,我在一个类中完成了所有函数和委托声明,并将函数添加到委托使用=并只调用委托.因此调用委托内的所有函数. 但现在我在两个不同的类中进行,并尝试在事件的帮助下完成所有功能.我在下面提供我目前的代码. public partial class Form1 : Form { public Form1() { InitializeComponent(); ArithmeticOperations aOperations = new ArithmeticOperations(); aOperations.StartCalculations += new ArithmeticOperations.BasicCalculations(aOperations_StartCalculations); aOperations.PerformCalculations(20,10); } void aOperations_StartCalculations(string msg) { MessageBox.Show(msg); } } class ArithmeticOperations { public delegate void BasicCalculations(string msg); public event BasicCalculations StartCalculations; public void PerformCalculations(int n1,int n2) { StartCalculations("Operation Success"); } void Add(int num1,int num2) { MessageBox.Show("Performing addition."); } void Sub(int num1,int num2) { MessageBox.Show("Performing substraction."); } void Mul(int num1,int num2) { MessageBox.Show("Performing multiplication."); } void Div(int num1,int num2) { MessageBox.Show("Performing division."); } } 这里的Form1是我的主类,ArithmeticOperations类用于执行功能.在这个声明上 aOperations.PerformCalculations(20,10); 在Form1中,将执行ArithmeticOperations类中的PerformCalculation()函数. 但我怀疑的是如何将所有Add,Sub,Mul和Div函数注册到ArithmeticOperations类中的委托,通过调用委托对象并将“Operation Success”返回到Form1类中的事件回调函数来调用所有函数? 解决方法
由于BasicCalculations采用string类型的单个参数,因此不能用于直接调用方法Add,Subtract等.
如果您希望PerformCalculations通过多播调用您的每个方法,您将需要一个等同于Action< int,int>的类型的委托,例如: class ArithmeticOperations { public delegate void BasicCalculations(string msg); public event BasicCalculations StartCalculations; private Action<int,int> calculations; public ArithmeticOperations() { this.calculations += this.Add; this.calculations += this.Sub; } public void PerformCalculations(int n1,int n2) { this.calculations.Invoke(n1,n2); StartCalculations("Operation Success"); } // ... } 如果您希望您的个别算术方法使用字符串调用StartCalculations事件,您可以让他们这样做: void Add(int num1,int num2) { StartCalculations("Performing addition."); } 在引发事件时,您应该首先测试是否有订阅者(以避免NullReferenceException). standard pattern将获得任何处理程序订阅,测试null然后调用处理程序.如果在测试事件为null之后有人取消订阅,这将避免遇到NullReferenceException: void Add(int num1,int num2) { var handler = this.StartCalculations; if (handler != null) { handler("Performing addition."); } } 由于每个方法会重复大量代码,因此可以将其重构为单独的方法: void Add(int num1,int num2) { this.OnStartCalculation("Performing addition."); } void OnStartCalculation(string message) { var handler = this.StartCalculations; if (handler != null) { handler(message); } } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |