gpt4 book ai didi

c# - C# 中的委托(delegate)

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

我在理解 C# 中委托(delegate)的工作方式时遇到了一些困难。我有很多代码示例,但我仍然无法正确理解。

有人可以用“简单的英语”向我解释一下吗?当然!代码示例会有所帮助,但我认为我需要更多关于其工作原理/原因的描述。

编辑:

好吧,问题是:委托(delegate)为什么要工作?整个过程的“流程图”是什么?

使用委托(delegate)的先决条件是什么?

我希望这能让问题更清楚。

最佳答案

思考委托(delegate)的一种方式就像是对函数的引用。例如,假设您在窗口中有一个按钮,并且您希望在单击该按钮时发生某些事情。您可以将委托(delegate)附加到按钮的 Click 事件,每当用户单击此按钮时,您的函数就会执行。

class MyWindow : Window
{
Button _button;

public MyWindow()
{
_button = new Button();
// place the button in the window
_button.Click += MyWindow.ButtonClicked;
}

static void ButtonClicked(object sender, RoutedEventArgs e)
{
MessageBox.Show("Button Clicked");
}
}

请注意我是如何使 ButtonClicked 成为静态函数的——接下来我想强调一下非静态函数。相反,假设 ButtonClicked 是一个非静态成员:

class MyWindow : Window
{
Button _button;
int _numClicked = 0;

public MyWindow()
{
this._button = new Button();
// place the button in the window
this._button.Click += this.ButtonClicked;
}

void ButtonClicked(object sender, RoutedEventArgs e)
{
this._numClicked += 1;
MessageBox.Show("Button Clicked " + this._numClicked + " times");
}
}

现在委托(delegate)包含对函数“ButtonClicked”的引用和调用该方法的实例“this”。 MyWindow 构造函数中的实例“this”与 ButtonClicked 中的“this”是相同的。

这是一个被称为闭包的概念的特定情况,它允许在创建委托(delegate)时“保存”状态——当前对象、局部变量等。在上面的例子中,我们在委托(delegate)的构造函数中使用了“this”。我们可以做的不止于此:

class MyWindow : Window
{
Button _button;
int _numClicked = 0;

public MyWindow(string localStringParam)
{
string localStringVar = "a local variable";
this._button = new Button();
// place the button in the window
this._button.Click += new RoutedEventHandler(
delegate(object sender, RoutedEventArgs args)
{
this._numClicked += 1;
MessageBox.Show("Param was: " + localStringParam +
" and local var " + localStringVar +
" button clicked " + this._numClicked + " times");
});
}
}

这里我们创建了一个匿名委托(delegate) - 一个没有给出明确名称的函数。引用此函数的唯一方法是使用 RoutedEventHandler 委托(delegate)对象。此外,此函数存在于 MyWindow 构造函数的范围内,因此它可以访问所有局部参数、变量和成员实例“this”。即使在 MyWindow 构造函数退出后,它将继续保留对局部变量和参数的引用。

作为旁注,委托(delegate)还将持有对对象实例的引用 - “this” - 即使在对类 a 的所有其他引用被删除之后。因此,为了确保一个类被垃圾回收,所有非静态成员方法的委托(delegate)(或在一个范围内创建的委托(delegate))都应该被删除。

关于c# - C# 中的委托(delegate),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1735203/

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