gpt4 book ai didi

c# - 与创建委托(delegate)相比,关键字委托(delegate)如何工作

转载 作者:太空狗 更新时间:2023-10-29 20:03:14 25 4
gpt4 key购买 nike

我正在慢慢了解委托(delegate),因为委托(delegate)的签名也必须与其委托(delegate)的方法的签名相匹配。

但是,请查看以下代码。

public static void Save()
{
ThreadStart threadStart = delegate
{
SaveToDatabase();
};
new Thread(threadStart).Start();
}

private static void SaveToDatabase() { }

我现在被难住了,因为委托(delegate)返回 void(SaveToDatabase() 就是这样)但是,它显然返回了一个 ThreadStart ...或者是吗?

如果我要编写自己的委托(delegate),我将不知道如何实现这一点,因为委托(delegate)必须为空才能匹配 SaveToDatabase() 的返回类型。但这是不可能的;它将是 ThreadStart 类型!

我的问题是,我是完全误解了,还是某些 .NET 诡计使这成为可能?如果我想编写此方法但要创建我自己的委托(delegate),我该怎么办?

最佳答案

“委托(delegate)”这个词有点滥用。使用类和对象更容易。 “类”就像一个对象的蓝图。 “对象”是内存中的实际实例,它遵循类的蓝图。

对于委托(delegate),我们使用相同的词,因此我怀疑您感到困惑。考虑以下代码:

class Main
{
public delegate int DelegateType(string x);
public int SomeFunction(string y) { return int.Parse(y)*2; }
public void Main()
{
DelegateType delegateInstance = null;
delegateInstance = SomeFunction;
int z = delegateInstance("21");
Console.WriteLine(z);
}
}

此代码输出“42”。

DelegateType 是委托(delegate)的类型。就像类是对象的蓝图一样,委托(delegate)是函数的蓝图。

所以稍后我们创建一个名为 delegateInstance 的变量,它的类型是 DelegateType。我们可以为该变量分配ANY 函数,该函数采用单个字符串参数并返回一个整数。请注意,我们分配的是函数本身,而不是该函数的结果。这就像 delegateInstance 变量现在是该函数的同义词。事实上,正如后面一行所演示的,我们现在可以使用 delegateInstance 来调用该函数!就像 delegateInstance 本身就是一个函数一样。但是,因为它是可变的,我们也可以做我们通常对变量做的所有相同的事情——比如将它们作为参数传递给其他函数,甚至从其他函数返回(一个返回函数的函数!绕过它!)

好吧,让我们看看让您感到困惑的代码。

public static void Save()
{
ThreadStart threadStart = delegate
{
SaveToDatabase();
};
new Thread(threadStart).Start();
}

private static void SaveToDatabase() { }

首先要注意的是您使用了匿名委托(delegate)。另一个误用这个词。编译后,结果如下:

public static void Save()
{
ThreadStart threadStart;
threadStart = __ASDASDASD6546549871;
var tmp = new Thread(threadStart);
tmp.Start();
}

private static void SaveToDatabase() { }

private void __ASDASDASD6546549871()
{
SaveToDatabase();
}

请注意,您的匿名函数实际上已转换为具有随机名称的完全常规函数,然后将该函数分配给 threadStart 变量。

所以现在这就像上面的例子一样。只需将 DelegateType 替换为 ThreadStart,将 delegateInstance 替换为 threadStart 并将 SomeFunction 替换为 __ASDASDASD6546549871

现在有意义吗?

关于c# - 与创建委托(delegate)相比,关键字委托(delegate)如何工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13802716/

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