sách gpt4 ăn đã đi

c# - 多播委托(delegate)和事件

In lại 作者:太空狗 更新时间:2023-10-29 20:24:33 25 4
mua khóa gpt4 giày nike

我正在研究委托(delegate)。几天前,我为多播委托(delegate)做了一个样本并在此处查看 My previous question并且清楚地了解多播委托(delegate)。

但现在我尝试用一个事件做一个多播委托(delegate)示例。但是我在做 sample 时有一些疑问。在上面的链接中,我在一个类中完成了所有函数和委托(delegate)声明,并使用 += 将函数添加到委托(delegate)中,然后调用委托(delegate)。因此委托(delegate)中的所有函数都被调用。

但现在我在两个不同的类中进行操作,并尝试在事件的帮助下完成所有功能。我在下面提供了我当前的代码。

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类中的委托(delegate)中,通过调用委托(delegate)对象调用所有函数并将“Operation Success”返回给Form1类中的事件回调函数?

câu trả lời hay nhất

BasicCalculations接受一个 sợi dây 类型的参数, 它不能用于直接调用您的方法 Thêm vào , Subtract

如果你想要PerformCalculations要通过多播调用您的每个方法,您需要一个等同于 Action 类型的委托(delegate),例如:

class ArithmeticOperations
{
public delegate void BasicCalculations(string msg);

public event BasicCalculations StartCalculations;

private Action 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是让任何处理程序订阅,测试vô giá trị然后调用处理程序。这将避免命中 NullReferenceException。 , 如果有人在测试 vô giá trị 的事件后取消订阅:

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);
}
}

关于c# - 多播委托(delegate)和事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15222895/

25 4 0
Đề xuất bài viết: c# - 以安全的方式发送电子邮件
Đề xuất bài viết: python - 在 django 中为 django-admin 有一个单独的数据库
Đề xuất bài viết: c++ - 在 C++ 中引用 C 结构
Đề xuất bài viết: Python PIL jpeg 质量
Chứng chỉ ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com
Xem sitemap của VNExpress