本文将介绍C#(版本:4.0)的Delegate的概念以及使用,部分延伸概念。本文是对MSDN中Delegates (C# Programming Guide)的提炼。
OVERVIEW:
1.Delegates 的概念类似于C/C++中的函数指针(Function Pointer),同时它是面向对象的、安全的(后半句还没体会到。)
2.Delegates允许方法(Method)被当做参数一样传递。
3.可以用作定义一个Callback 方法。(所谓CALLBACK:One of the most useful things to do with function pointers is pass a function as an argument to another function. Functions used as arguments to another function are sometimes called callback functions.)
4.可以被链在一起(Chain together,这是C#的一个概念例如Class.Where().Where(),Where()是执行一个方法)。
5. Using Variance in Delegates ,如此delegate方法时不需完全切合Delegate的类型
6.C# Ver 2.0介绍了 Anonymous Methods的概念(方法可被当做参数传递)。C# 3.0 介绍 lambda expressions 。 anonymous methods 和 lambda expressions (在特定的语境) 会被编译成 delegate 类型. 这些被称作 anonymous functions 。
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
示例
1.声明一个delegate对象。请注意Del 是属于 delegate type(delegate type衍生于delegate class)
The following example declares a delegate named Del
that can encapsulate a method that takes a string as an argument and returns void;
public delegate void Del(string message);这里一个名为Del的delegate可以对一个方法(该方法以一个 string 参数输入,返回void)进行了封装(encapsulate)。
// 创建一个方法用于以便演示 delegate 一个方法DelegateMethod。 public static void DelegateMethod(string message) { System.Console.WriteLine(message); }
// 实例化一个 delegate. Del handler = DelegateMethod; // 调用那个 delegate object. handler("Hello World");
3.如何定义一个CALLBACK,即把一个实例化的Delegata当做一个参数传递到一个方法。
public void MethodWithCallback(int param1, int param2, Del callback) { callback("The number is: " + (param1 + param2).ToString()); }
//You can pass the delegate"handler" created above to the method.
MethodWithCallback(1, 2, handler);
4.Delegate是Del一个对象的(实例化的),同时通过’+=’or‘+’运算符可以建造一个调用列表(invocation list)
public class MethodClass { public void Method1(string message) { } public void Method2(string message) { } }
//DelegateMethod见示例2中的声明
MethodClass obj = new MethodClass(); Del d1 = obj.Method1; Del d2 = obj.Method2; Del d3 = DelegateMethod; //两种赋值方式都可以创建调用列表(invocation list):allMethodsDelegate。其中的方法会被按顺序调用。
//调用allMethodsDelegate称为Multicasting
Del allMethodsDelegate = d1 + d2;
allMethodsDelegate += d3;
//remove Method1 allMethodsDelegate -= d1; // copy AllMethodsDelegate while removing d2 Del oneMethodDelegate = allMethodsDelegate - d2;
6.Because delegate types are derived from System.Delegate
, the methods and properties defined by that class can be called on the delegate. For example, to find the number of methods in a delegate's invocation list, you may write:
int invocationCount = d1.GetInvocationList().GetLength(0);
7.只有都属于System.Delegate的对象才可以返回TURE.
delegate void Delegate1(); delegate void Delegate2(); static void method(Delegate1 d, Delegate2 e, System.Delegate f) { // Compile-time error. //Console.WriteLine(d == e); // OK at compile-time. False if the run-time type of f // is not the same as that of d. System.Console.WriteLine(d == f); }