天天看點

關于C#委托的一些學習筆記

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”);
}
}
      

有一段時間沒寫了,之前在做一兩個老師布置的小項目,希望自己能夠堅持寫下去。