从委托而起(二)认识委托
新建一個控制臺應用程序,這個程序的作用是為一個字符串改變樣子,所以起個名字叫Costumeball吧.嘉賓(字符串)通過一個個化妝間(函數)變得漂漂亮亮或奇奇怪怪后一起唱歌跳舞.好享受.
聲明一個委托,委托一般出現在類之外,本例隨便
delegate?void?Prink(string?str);
創建與委托管理的方法,他們的簽名必須一致
?static?void?Upper(string?str)?
?{
?????Console.WriteLine(str.ToUpper());
?}
?static?void?Lower(string?str)?
?{
?????Console.WriteLine(str.ToLower());
?}
?static?void?Mark(string?str)
?{
?????Console.WriteLine("\""+str+"\"");
?}
聲明委托類型變量delegate?void?Prink(string?str);,
Main方法代碼如下:
static?void?Main(string[]?args)
{
?????string?str="FaTSo";
?????//進行委托綁定
?????prink?=?new?Prink(Upper);
//回調方法
?????prink(str);
?????Console.ReadKey();
}
上述示例,在類內部聲明了一個Prink委托類型.他具有和關聯方法一樣的簽名(參數,返回值),否則會編譯錯誤.將方法Upper傳給了Prink構造函數,也就是將方法Upper指派給了Prink委托,并將其引用賦值給了prink變量,prink變量保存了Upper方法的指針,實現對Upper的回調.
再一個,在Main函數中添加下面代碼:
?prink?=?new?Prink(Mark);
?prink(str);
F5運行能看到prink(Mark)也得到了執行.先不管他怎么回事現在一起回憶下接口.寫一個最簡單接口的例子
????interface?IInterface
????{
????????void?SayHi();
????}
????class?Student:IInterface
????{
????????public?void?SayHi()
????????{
????????????Console.WriteLine("我是學生");
????????}
????}
????class?Teacher:IInterface
????{
????????public?void?SayHi()
????????{
????????????Console.WriteLine("我是老師");
????????}
}
在Main函數寫上執行代碼:
???????IInterface?p1;?
????????????p1?=?new?Student();
????????????p1.SayHi();
????????????p1?=?new?Teacher();
????????????p1.SayHi();
分別輸出,我是學生,我是老師.
???prink?=?new?Prink(Upper);
????????????prink(str);
????????????prink?=?new?Prink(Mark);
????????????prink(str);
????????????p1?=?new?Student();
????????????p1.SayHi();
????????????p1?=?new?Teacher();
????????????p1.SayHi();
很像,有木有,有木有.
委托將方法當作參數進行傳遞,并根據傳入的方法來動態的改變方法調用。只要為委托提供相同簽名的方法,就可以與委托綁定.
而接口約束了實現接口的類所存在的方法,根據實例化類型找到該方法,接口保障了子類必須實現接口方法.
都可以實現統一方法的調用.委托是參數類型不同,接口類是實例化對象不同.簡單的說,委托就是?一個方法容器,你能往里面放很多方法,然后統一調用,一個委托代表一個真實的方法。
多播委托,你讓我干嘛,好我馬上去做,你讓我干嘛,好我馬上去做.......
用+=和-=操作符分別進行綁定和解除綁定的操作,
public?static?void?Main()
{
string?str?=?"FaTSo";
prink?+=?new?Prink(Upper);
prink?+=?new?Prink(Mark);
prink?+=?new?Prink(Lower);
prink?-=?new?Prink(Upper);
prink(str);
}
執行后依次輸出?"FaTSo"?fatso,事實上+=和-=操作分別調用了Deleagate.Combine和Deleagate.Remove方法,多播委托返回值一般都是void,委托類型非void時,多播委托將返回最后一個調用方法的執行結果.
委托的補充,回調方法真正的調用者是Invoke.可以在代碼中顯示調用
prink.Invoke(str);
轉載于:https://www.cnblogs.com/jamesliu/archive/2011/08/18/2144278.html
總結
以上是生活随笔為你收集整理的从委托而起(二)认识委托的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [MAC]用beamoff给VMware
- 下一篇: docker高级应用之动态扩展容器空间大