您好,登錄后才能下訂單哦!
本篇內容主要講解“.NET委托不同版本怎么寫”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“.NET委托不同版本怎么寫”吧!
.NET 1.x中委托的寫法
委托,如果不追究細節,從表面上來看我們可以將其通俗地理解為一個安全的“函數指針”。當然,這個函數指針其實也是一個對象,有自己的成員,也會封裝了被調用方的上下文等等。至于委托的定義和使用方式,則是這樣的:
public delegate int SomeDelegate(string arg1, bool arg2); public static int SomeMethod(string arg1, bool arg2) { return 0; } public class SomeClass { public int SomeMethod(string a1, bool a2) { return 0; } public event SomeDelegate SomeEvent; } static void Main(string[] args) { SomeClass someClass = new SomeClass(); SomeDelegate someDelegate = new SomeDelegate(someClass.SomeMethod); someClass.SomeEvent += new SomeDelegate(SomeMethod); }
可見,在.NET 1.x中需要使用new DelegateType(...)的方式來創建一個委托對象。不過,作為委托對象內部的方法它既可以是實例方法,也可以是靜態方法。此外,方法只需要匹配委托類型的簽名和返回值即可,方法參數的名稱不會成為約束。
嗯,就是這么簡單。
.NET 2.0中委托的寫法
.NET委托引入了范型,且寫法略有簡化:
public delegate TResult MyFunc(T1 a1, T2 a2); public static int SomeMethod(string a1, bool a2) { return 0; } static void Main(string[] args) { MyFunc<string, bool, int> myFunc = SomeMethod; }
在.NET 2.0中,new DelegateType已經可以省略,開發人員可以直接將方法賦值給一個委托對象的引用。當然,這個改進不值一提,.NET 2.0中委托寫法的關鍵在于引入了“匿名方法”:
public static void TestRequest(string url) { WebRequest request = HttpWebRequest.Create(url); request.BeginGetResponse(delegate(IAsyncResult ar) { using (WebResponse response = request.EndGetResponse(ar)) { Console.WriteLine("{0}: {1}", url, response.ContentLength); } }, null); }
匿名方法,簡單地說就是內聯在方法內部的委托對象,它的關鍵便在于形成了一個閉包(委托執行時所需的上下文)。如上面的代碼中,BeginGetResponse的***個參數(委托)可以直接使用TestRequest方法的參數url,以及方法內的“局部”變量request。如果沒有匿名函數這個特性的話,代碼寫起來就麻煩了,例如在.NET 1.x中您可能就必須這么寫:
public static void TestRequest(string url) { WebRequest request = HttpWebRequest.Create(url); object[] context = new object[] { url, request }; request.BeginGetResponse(TestAsyncCallback, context); } public static void TestAsyncCallback(IAsyncResult ar) { object[] context = (object[])ar.AsyncState; string url = (string)context[0]; WebRequest request = (WebRequest)context[1]; using (WebResponse response = request.EndGetResponse(ar)) { Console.WriteLine("{0}: {1}", url, response.ContentLength); } }
此時,我們往往會發現,開發人員需要花費大量的精力,為一小部分代碼維護一大段上下文。例如在這段代碼中,我們會將url和request對象塞入一個object數組中,在回調函數中再通過危險的Cast操作恢復數據。如果您希望“強類型”,那么只能為每個回調創建一個新的上下文對象,維護起來可能更加麻煩——要知道,在并行編程,異步調用越來越重要的今天,如果沒有匿名方法自動保留上下文的特性,開發人員會為這些“額外工作”疲于奔命的。
可能您會說,匿名方法的可讀性不佳,因為需要“內聯”。一個方法中內聯太多,維護成本就上去了,所以匿名方法并不推薦使用。我想說的是,您錯了。如果為了可維護性,要將方法獨立拆開,也可以利用匿名方法的優勢:
public static void TestRequest(string url) { WebRequest request = HttpWebRequest.Create(url); request.BeginGetResponse(delegate(IAsyncResult ar) { TestAsyncCallback(ar, request, url); }, null); } public static void TestAsyncCallback(IAsyncResult ar, WebRequest request, string url) { using (WebResponse response = request.EndGetResponse(ar)) { Console.WriteLine("{0}: {1}", url, response.ContentLength); } }
如果借助.NET 3.5中的Lambda表達式,代碼可以寫的更簡單易讀:
public static void TestRequest(string url) { WebRequest request = HttpWebRequest.Create(url); request.BeginGetResponse(ar => TestAsyncCallback(ar, request, url), null); }
到此,相信大家對“.NET委托不同版本怎么寫”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。