重新认识C#..
时间:2011-03-07 来源:小刚qq
知识积累,重新回味下知识也许会有不少新认识..
1,C# 委托
委托: 是一种引用方法的类型。一旦为委托分配了方法,委托将与该方法具有完全相同的行为。委托方法的使用可以像其他任何方法一样,具有参数和返回值
将方法作为参数进行引用的能力使委托成为定义回调方法的理想选择。例如,可以向排序算法传递对比较两个对象的方法的引用。分离比较代码使得可以采用更通用的方式编写算法。
委托概述
委托具有以下特点:
委托类似于 C++ 函数指针,但它是类型安全的。
委托允许将方法作为参数进行传递。
委托可用于定义回调方法。
委托可以链接在一起;例如,可以对一个事件调用多个方法。
方法不需要与委托签名精确匹配。
C# 2.0 版引入了匿名方法的概念,此类方法允许将代码块作为参数传递,以代替单独定义的方法。
C# 1.0声明委托
public delegate void Del<T>(T item);
public void Notify(int i) { }
使用委托
Del<int> d1 = new Del<int>(Notify);
C#2.0使用委托
Del<int> d2 = Notify;
C#3.0以上版本可以使用Lambda表达式来取代C#2.0里面的匿名委托
Action<int> d3 = s => s;
下面分别做下比较
public class DelegateExample { //命名委托 delegate void Del(int i, double j); //匿名委托
delegate void Printer(string s); public static void Run() { //C#2.0之前的命名方法委托
Del dl = MultiplyNumbers; for (int i = 0; i < 5; i++) { dl(i,2); } //C#2.0引y入?了?匿?名?方?法¨--匿?名?方?法¨的?参?数y的?范?围§是?“°匿?名?方?法¨块é”±。£ Printer print = delegate(string p) { Console.WriteLine(p); }; //使用匿名委托
print("匿名函数"); //使用命名方法的委托
print = new Printer(DoWork); print("命名方法委托"); // C# 3.0 及更高版本中,Lambda 表达式取代了匿名方法
//上面的例子可以改为Action有参数但无返回值的,如果是有返回值的用Func<>
Action<string> funcprint = s => Console.WriteLine(s); funcprint("Lambda表达式"); Console.ReadKey(); } static void MultiplyNumbers(int i, double j) { Console.WriteLine("i * j = " + i * j); } static void DoWork(string p) { Console.WriteLine(p); } }