Delegate的相关概念不清楚的请点击delegate 概念 ,以下只讲解Delegate的几种使用方式,delegate在C# 2.0 版引入了匿名方法,3.0 引入了 Lambda 表达式,匿名方法和Lambda表达式(在某些上下文中)都可编译为委托类型。这些功能统称为匿名函数。有关 Lambda 表达式的更多信息请点击匿名函数 .委托的三种使用方法例子如下:
public Test{
delegate void myDelegate(string s,int i);//声明委托
public static void Print(string s,int i){
Console.writeLine(s+i);
}
myDelegate d1=new myDelegate(Print);//1.0方式
myDelegate d2=delegate(string s,int i){Console.WriteLine(s+i);};//2.0匿名方式
myDelegate d3=(x,num)=>{Console.WriteLine(x+num);};//3.0 Lambda 表达式方式
d1("传统方式",1); d2("匿名方式",2);d3("Lambda表达式方式",3);
}
在.netFramework3.5中委托方法不必与委托签名完全匹配,具体请点击 委托中的协变与逆变 以下是实例:
1>:协变 :用于继承
class Mammals{}//父类
class Dogs : Mammals{}//子类
class Program
{
public delegate Mammals HandlerMethod();// 定义委托
public static Mammals FirstHandler()//返回值为父类
{ return null; }
public static Dogs SecondHandler()//返回值为子类
{ return null;}
static void Main()
{
HandlerMethod handler1 = FirstHandler;
HandlerMethod handler2 = SecondHandler;
}
}
2>:逆变:以前必须使用若干个具有相同参数的事件处理程序,现在只需要一个
System.DateTime lastActivity;
public Form1()
{
InitializeComponent();
lastActivity = new System.DateTime();
this.textBox1.KeyDown += this.MultiHandler; //文本框的KeyDown事件
this.button1.MouseClick += this.MultiHandler; //按钮的MouseClick事件
}
//事件处理程序
private void MultiHandler(object sender, System.EventArgs e)
{lastActivity = System.DateTime.Now;}
在.netFramework中System.Action委托经典使用方法:
使用Action<T>输出泛型List中的值
public void actionTest(){//测试方法
List<string> l = new List<string>();
l.Add("dd");
l.Add("bn");
l.Add("cn");
//1:可以使用外部委托方法(方法名做为参数)
l.ForEach(Print);
//2:可以使用委托类型(匿名委托)
l.ForEach(delegate(string name)
{
this.TextBox1.Text += name;
});
}
private void Print(string s) {//输出方法
this.TextBox1.Text += s;
}
使用委托方式调用数组列表中静态声明的方法
//测试入口
public void ActionTest()
{
string[] ss = { "method1", "method2" };
Action<string[]> a = (s) => Actions(ss);//Lambda
}
delegate void MyDelegateMethod();//定义委托
public void Actions(string[] s)
{
for (int i = 0; i < s.Length; i++)
{
System.Reflection.MethodInfo d = this.GetType().GetMethod(s[i]);//获取实例方法
Delegate de = MyDelegateMethod.CreateDelegate(typeof(MyDelegateMethod), d);//创建委托类型方法
if (de != null)
{
MyDelegateMethod m = (MyDelegateMethod)de;//类型转换
m();//调用方法
}
}
}
public void method1() {
Console.WriteLine("method1");
}
public void mehtod2() {
Console.WriteLine("method2");
}
希望通过以上几个小实例,能让你加深对delegat印象。如果有什么问题,请指证,多谢!