1. 程式人生 > >對委託的理解記錄

對委託的理解記錄

這只是我的一些理解,如有指導和補充,非常歡迎

委託是一個類,一個引用型別。與其他的引用型別沒有本質區別。用delegate宣告時,編譯器自動生成類,類的名字為委託變數名。委託可以引用例項和靜態方法,· NET 的委託是型別安全的。

委託:一套模板。不過這套模板是針對方法的模板,用來執行方法的東西,模板裡面主要規定的就是方法的返回值和方法中用到的引數型別。 下面是宣告委託

-  Public delegate void SayHello(string Name,string Myself);

這個委託規定的返回值是Void,也就是說是無返回值的。引數型別規定的是兩個,分別都是兩個String型別

的引數。

委託只是定義模板,是方法的抽象。具體的實現還是有方法本身的實現,呼叫方法的時候直接呼叫委託。 下面是方法具體實現的方法體:

- //這是我們想要傳遞的方法,它和SayHello有相同的返回值和同型別的引數(既尊重上面那個委託的模板)

- public void LiuLianToDingSen(string D,string L) 
- {
- Debug.Log(D+",你好,我叫"+L);
-  }

上面說過呼叫的時候可以直接呼叫委託,所以我們下面要做的就是把委託和方法建立聯絡。

- //我們已經聲明瞭委託這個模板,下面我就要做的就是 初始化委託變數和委託繫結
- SayHello hello=new SayHello(LiuLianToDingSen);
- //回撥委託方法
- hello(“丁森”,“榴蓮”);

這個時候打印出來就是 丁森,你好,我叫榴蓮 如果繫結兩次就是列印兩次

- SayHello hello= new SayHello(LiuLianToDingSen);        
- hello += LiuLianToDingSen;
- hello("丁森", "榴蓮");

這種時候打印出來就是 兩遍 丁森,你好,我叫榴蓮

因為我們在委託例表裡面加入了兩個方法,委託被呼叫後,列表的每個方法都會執行。這個時候我們需要注意的時候什麼——判斷是否為空,因為呼叫空委託會丟擲異常的,所以我們的程式碼就是下面這樣了

- SayHello hello= new SayHello(LiuLianToDingSen);        
- hello += LiuLianToDingSen;
- if(hello!=null)
- {
- hello(“丁森”,“榴蓮”);
- }

現在我們在委託列表中加入了兩個方法,如果現在去掉一個方法我們就這樣操作,用 “-=” 處理

- SayHello hello= new SayHello(LiuLianToDingSen);        
- hello += LiuLianToDingSen;
- if(hello!=null)
- {
- hello(“丁森”,“榴蓮”);
- }
- hello-=LiuLianToDingSen;

現在列印資訊出來的就只有一次 丁森,你好,我叫榴蓮