如果我宣布代表
public delegate void firstDelegate(string str);
firstDelegate handler = Strfunc;
handler("Hello World");
..
static void Strfunc(string str)
{
Console.WriteLine(str);
}
编译器将翻译以下行
firstDelegate handler=Strfunc;
到
firstDelegate=new firstDelegate(Strfunc);
答案 0 :(得分:2)
没错。这是反射器的反汇编:
.method private hidebysig static void Main(string[] args) cil managed
{
.entrypoint
.maxstack 3
.locals init (
[0] class ConsoleApplication4.Program/firstDelegate handler)
L_0000: nop
L_0001: ldnull
L_0002: ldftn void ConsoleApplication4.Program::Strfunc(string)
L_0008: newobj instance void ConsoleApplication4.Program/firstDelegate::.ctor(object, native int)
L_000d: stloc.0
L_000e: ldloc.0
L_000f: ldstr "Hello World"
L_0014: callvirt instance void ConsoleApplication4.Program/firstDelegate::Invoke(string)
L_0019: nop
L_001a: ret
}
在C#中看起来像这样:
private static void Main(string[] args)
{
firstDelegate handler = new firstDelegate(Program.Strfunc);
handler("Hello World");
}
答案 1 :(得分:1)
到目前为止,我可以说,是的。
这被称为“委托推理”。
顺便说一句,如果你想将另一个函数“追加”到这个代理,请使用:
handler + = AnotherFunctionName;
以下是专业C#-2008第7章中C#专业的话:
为了减少键入,在需要委托实例的每个地方,您只需传递名称即可 地址。这称为委托推理一词。只要编译器可以,这个C#功能就可以工作 将委托实例解析为特定类型。 由C#编译器创建的代码是相同的。编译器检测到委托类型是 必需的,因此它创建该委托类型的实例 将方法的地址传递给构造函数。