时间: 2020-09-5|tag:49次围观|0 条评论

1.什么是委托就是把方法作为参数传给另一个方法。委托说指向的函数,必须和函数具有相同的签名(返回值和参数类型)

Public delegate void DelSayHi(string name);Class proglem{ Static void Main(string[] args){Test(张三,saychiese);Test(bob,sayenglish);Console.readline();}Public static void test(string name,DelSayHi del){Del(name);}Public static void saychinese(string name){Console.writeline(“吃了么:”+name);}Public static void sayEnglish(string name){Console.write(“nice to meat you”+name);}}

以上方法好像没有字节用方法来得直接,那么用委托到底好在哪里?

个人认为,委托的精华事lamda表达式,如下是一个lamda表达式的小例子:

Public delegate void SayHi(string name)Class progtam{Static void Main(){//lama表达式=>goes toSayHi del=(string name)=>{console.writeLine(“你好”+name);};Del(“张三”);Console.readKey();}}

2.关于匿名函数(没有函数名的函数):

类似这样的用法叫做匿名函数:

 

Object result=GetMax(o,delegate(object o1,object o2){String s1=(string)o1;String s2=(string)o2;Return s1.Length-s2.length;});

以下是匿名函数的完整小例子:

 

Class Program{Public delegate int compatrDel(object o,objecto2)Static void main(string[] args){Object[] 0={“abc,””fdssfhjdkgsh”,”sdfajsdfhasdjkfh”,”agshdfdashf”}Object result=GetMax(o,delegate(objecto1,object o2){String s1=(string)o1;String s2=(string)o2;Return s1.Length-s2.length;});Console.writeline(result);Console.readkey();}} Public static object GetMax(object[]nums,compatrDel del){Object max=num[0];For(int i=0;i<nums.length;i++){If(dek(max,num[i])<0){Max=num[i];}}}

3.泛型委托:(返回值类型和输入值类型不确定的委托)

 

Public delegate int delcompare<T>(T t1,T t2);Class program{Static void Main(string[] args){Int[] nums={1,2,3,4,5};Int max=getMax<int>(nums,compare1);Console.writeline(max);Console.readkey();String names={“abxd”,”sdagfdsgfd”,”sdfggsdfg”};getMax<string>(names,(string s1,string s2)=>{return s1.length-s2.length;})Console.readkey();}Public static T GetMax<T>(T[] nums,Delcompare<T> del){T max=nums[0];For(int i=0;i<nums.length;i++){If(del(max,nums[i])<0){Max=nums[i];}}Return max;}Public static int Compare1(int n1,int n2){Return n1-n2;}}

4.lamda表达式的常见几种形式:

 

Public delegate void delOne();Public delegate void delTwo(string name);Public delegate string DelThree(string name);Class Program{Static void Main(string[] args){Delone del=()=>{};delTwo del2=(string name)=>{};delThree del3=(sting name)=>{return name;};list<int>  list=new list<int>() {1,2,3,4,5,6};list.removeAll(n=>n>4);foreach(var item in list){Console.writeLine(item);}Console.readKey();}}

其中,有一种lamda表达式的特殊形式,要特别关注:

 

list<int>  list=new list<int>() {1,2,3,4,5,6};

list.removeAll(n=>n>4);

foreach(var item in list)

{

Console.writeLine(item);

}

5.委托的运用之窗体传值:

 

 

在窗体1:Void showMsg(string str){Label1.text=str;}Form2 fm=new form2(showMsg);Fm.show();窗体一又方法,没有值。窗体二,有值没有方法。在窗体2中:Public delegate void DelTest(string str);Public Deltest _del;Public Form2(DelTest del){This._del=del;Initializevonponent();}Private void button_Click(objectsender,EventArgs e){_del(textBox1.text);}

通过这种方法可以实现在新窗体中控制父窗体中的控件。

 

5.多播委托:(宅男我不由地想好了波多野结衣)

委托不仅仅能指向一个函数,还能指向多个函数,这是通过duobo委托实现的。

如下事例子:

Public delegate void DelTest(string name);Class Program{Stratic void Main(string[] args){Deltest del=T1;DEL+=T2;Del+=T3;Del+=T4;Del-=T1;Del();Console.readKey();}Public static void T1(){Console.writeLine(“我是T1”);}Public static void T2(){Console.writeLine(“我是T2”);}Public static void T3(){Console.writeLine(“我是T3”);}Public static void T4(){Console.writeline(“我是T4”);}}

有一段时间没写了,之前在做一两个老师布置的小项目,希望自己能够坚持写下去。

 

文章转载于:https://www.cnblogs.com/CoderAyu/p/8490154.html

原著是一个有趣的人,若有侵权,请通知删除

本博客所有文章如无特别注明均为原创。
复制或转载请以超链接形式注明转自起风了,原文地址《关于C#委托的一些学习笔记
   

还没有人抢沙发呢~