“代表”这个词有点滥用。使用类和对象更容易。“类”就像一个对象的蓝图。“对象”是内存中的实际实例,它遵循类的蓝图。
对于代表,我们使用相同的词,因此我怀疑您的困惑。考虑以下代码:
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
是委托的类型。就像类是对象的蓝图一样,委托是函数的蓝图。
所以稍后我们创建一个名为的变量delegateInstance
,它的类型为DelegateType
。对于该变量,我们可以分配任何接受单个字符串参数并返回整数的函数。请注意,我们分配了函数本身,而不是该函数的结果。就像delegateInstance
变量现在是该函数的同义词。确实,正如后面一行演示的那样,我们现在可以使用delegateInstance
来调用该函数!就好像delegateInstance
一个函数本身一样。但是,由于它是可变的,我们也可以做我们通常对变量做的所有相同的事情——比如将它们作为参数传递给其他函数,甚至从其他函数返回(一个返回函数的函数!绕着你的脑袋!)
好的,让我们看看让你感到困惑的代码。
public static void Save()
{
ThreadStart threadStart = delegate
{
SaveToDatabase();
};
new Thread(threadStart).Start();
}
private static void SaveToDatabase() { }
首先要注意的是您使用了anonymous 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
现在有意义吗?