委托在c# 1 时代产生出来的时候,估计无人可以预想到会对C#语言产生如此大的影响。c#1 要创建委托实例。必须指定委托的类型和操作。
- 声明委托 public delegate bool CompareHandler(int x,int y);
- 操作方法:
public bool CompareData(int x,int y) { return x>y; }
- 绑定 CompareHandler handler = new CompareHandler(CompareData);
- 构建链式委托采用 Delegate.Combine(handler,...) , Delegate.Remove();
c# 2.0 时代加入了语法糖 += ,-=构建链式委托.同时支持委托的协变与逆变。
方法组转换:
方法组就是重载方法。方法组可以隐式转换为兼容的委托。
public delegate void EventHandler(object o,EventArgs e); public TestMethod(){} public TestMethod(object o,EventArgs e){} EventHandler h=TestMethod;
不过 方法组不能隐式的转换Delegate, 显示转换如下
Delegate d = (EventHandler)TestMethod
并且对于已经重载转换委托类型的方法,就不能把它作为方法参数使用,下面的 就会出现错 参数 1: 无法从“方法组”转换为“System.Delegate”
public delegate void EventHandler(object o, EventArgs e); public static void TestMehod(object o, EventArgs e) { } public static void TestMethodt(Delegate d) { } TestMethodt(TestMehod);
采用强制转型 TestMethodt((EventHandler)TestMehod);
委托匿名方法转换
匿名方法转换 在ECMA 344 13.5
1.无返回类型参数匹配
Action<int> s = delegate{ };
Action<int> a = delegate(int x) { };
3.匿名方法闭包:
闭包 抓取的是就是变量本身。如下的两种情况。对于counter来说List中抓的都是新的实例。对于i所有的list都是同一个变量
List<Action> lst = new List<Action>(); for (int i=0;i<3;++i) { int counter = i*10; lst.Add(delegate { Console.WriteLine("values is "+i); i++; }); } foreach (var t in lst) { t(); } lst[0](); lst[0](); lst[2](); lst[2]();
List<Action> lst = new List<Action>(); for (int i=0;i<3;++i) { int counter = i*10; lst.Add(delegate { Console.WriteLine("values is " + counter); counter++; }); } foreach (var t in lst) { t(); } lst[0](); lst[0](); lst[2](); lst[2]();
c# 委托小姐
时间: 2024-10-06 01:26:16