当定义带有参数的匿名方法时,应该在 delegate 关键字后面定义参数类型和名称,就好像它是一个常规方法一样。方法签名必须与它指派的委托的定义相匹配。当调用委托时,可以传递参数的值,与正常的委托调用完全一样:
class SomeClass
{
delegate void SomeDelegate(string str);
public void InvokeMethod()
{
SomeDelegate del = delegate(string str)
{
MessageBox.Show(str);
};
del("Hello");
}
}
如果匿名方法没有参数,则可以在 delegate 关键字后面使用一对空括号:{
delegate void SomeDelegate(string str);
public void InvokeMethod()
{
SomeDelegate del = delegate(string str)
{
MessageBox.Show(str);
};
del("Hello");
}
}
class SomeClass
{
delegate void SomeDelegate();
public void InvokeMethod()
{
SomeDelegate del = delegate()
{
MessageBox.Show("Hello");
};
del();
}
}
{
delegate void SomeDelegate();
public void InvokeMethod()
{
SomeDelegate del = delegate()
{
MessageBox.Show("Hello");
};
del();
}
}
然而,如果您将 delegate 关键字与后面的空括号一起忽略,则您将定义一种特殊的匿名方法,它可以指派给具有任何签名的任何委托:
class SomeClass
{
delegate void SomeDelegate(string str);
public void InvokeMethod()
{
SomeDelegate del = delegate
{
MessageBox.Show("Hello");
};
del("Parameter is ignored");
}
}
{
delegate void SomeDelegate(string str);
public void InvokeMethod()
{
SomeDelegate del = delegate
{
MessageBox.Show("Hello");
};
del("Parameter is ignored");
}
}
明显地,如果匿名方法并不依赖于任何参数,而且您想要使用这种与委托签名无关的方法代码,则您只能使用这样的语法。注意,当调用委托时,您仍然需要提供参数,因为编译器为从委托签名中推理的匿名方法生成无名参数,就好像您曾经编写了下面的代码(在 C# 伪码中)一样:
SomeDelegate del = delegate(string)
{
MessageBox.Show("Hello");
};
{
MessageBox.Show("Hello");
};
此外,不带参数列表的匿名方法不能与指出参数的委托一起使用。
匿名方法可以使用任何类成员变量,并且它还可以使用定义在其包含方法范围之内的任何局部变量,就好像它是自己的局部变量一样。
因为 += 运算符仅仅将一个委托的内部调用列表与另一个委托的内部调用列表连接起来,所以可以使用 += 来添加一个匿名方法。注意,在匿名事件处理的情况下,不能使用 -= 运算符来删除事件处理方法,除非将匿名方法作为处理程序加入,要这样做,可以首先将匿名方法存储为一个委托,然后通过事件注册该委托。在这种情况下,可以将 -= 运算符与相同的委托一起使用,来取消将匿名方法作为处理程序进行注册。