关于C#委托的一些学习笔记
1.什么是委托就是把方法作为参数传给另一个方法。委托说指向的函数,必须和函数具有相同的签名(返回值和参数类型)
个人认为,委托的精华事lamda表达式,如下是一个lamda表达式的小例子:
3.泛型委托:(返回值类型和输入值类型不确定的委托)
4.lamda表达式的常见几种形式:
其中,有一种lamda表达式的特殊形式,要特别关注:
有一段时间没写了,之前在做一两个老师布置的小项目,希望自己能够坚持写下去。
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 to SayHi 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”); } }
有一段时间没写了,之前在做一两个老师布置的小项目,希望自己能够坚持写下去。