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 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”);
}
}
有一段時間沒寫了,之前在做一兩個老師布置的小項目,希望自己能夠堅持寫下去。