對委託的理解記錄
阿新 • • 發佈:2018-12-12
這只是我的一些理解,如有指導和補充,非常歡迎
委託是一個類,一個引用型別。與其他的引用型別沒有本質區別。用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;
現在列印資訊出來的就只有一次 丁森,你好,我叫榴蓮