C# 支持用于调用一个或多个方法的委托 (delegate)。委托提供运算符和方法来添加或删除目标方法,它也可以在整个 .NET 框架中广泛地用于事件、回调、异步调用、多线程等。
常规委托:
class SomeClass {
delegate void SomeDelegate();
public void InvokeMethod() {
SomeDelegate del = new SomeDelegate(SomeMethod);
del();
}
void SomeMethod() {
MessageBox.Show("Hello");
}
}
可以用一个匿名方法来定义和实现这个方法:
class SomeClass {
delegate void SomeDelegate();
public void InvokeMethod() {
SomeDelegate del = delegate() { MessageBox.Show("Hello"); };
del();
}
}
=============================================================
class SomeClass {
delegate void SomeDelegate();
public void SomeMethod() {
InvokeDelegate(delegate(){MessageBox.Show("Hello");});
}
void InvokeDelegate(SomeDelegate del) {
del();
}
}
将参数传递到匿名方法:
class SomeClass {
delegate void SomeDelegate(string str);
public void InvokeMethod() {
SomeDelegate del = delegate(string str) { MessageBox.Show(str); };
del("Hello");
}
}
一般的匿名方法:
class SomeClass<T> {delegate void SomeDelegate(T t);public void InvokeMethod(T t) {SomeDelegate del = delegate(T item){...}del(t);}}注意点:
1.如果匿名方法没有参数,则可以在 delegate 关键字后面使用一对空括号:
class SomeClass {
delegate void SomeDelegate();
public void InvokeMethod() {
SomeDelegate del = delegate() { MessageBox.Show("Hello"); };
del();
}
}
2.如果您将 delegate 关键字与后面的空括号一起忽略,
则您将定义一种特殊的匿名方法,它可以指派给具有任何签名的任何委托:
class SomeClass {delegate void SomeDelegate(string str);public void InvokeMethod() {SomeDelegate del = delegate { MessageBox.Show("Hello"); };del("Parameter is ignored");}}