溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

.NET委托不同版本怎么寫

發(fā)布時間:2022-01-10 11:07:54 來源:億速云 閱讀:168 作者:iii 欄目:編程語言

本篇內(nèi)容主要講解“.NET委托不同版本怎么寫”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“.NET委托不同版本怎么寫”吧!

.NET 1.x中委托的寫法

委托,如果不追究細節(jié),從表面上來看我們可以將其通俗地理解為一個安全的“函數(shù)指針”。當然,這個函數(shù)指針其實也是一個對象,有自己的成員,也會封裝了被調(diào)用方的上下文等等。至于委托的定義和使用方式,則是這樣的:

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(...)的方式來創(chuàng)建一個委托對象。不過,作為委托對象內(nèi)部的方法它既可以是實例方法,也可以是靜態(tài)方法。此外,方法只需要匹配委托類型的簽名和返回值即可,方法參數(shù)的名稱不會成為約束。

嗯,就是這么簡單。

.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已經(jīng)可以省略,開發(fā)人員可以直接將方法賦值給一個委托對象的引用。當然,這個改進不值一提,.NET 2.0中委托寫法的關(guān)鍵在于引入了“匿名方法”:

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

匿名方法,簡單地說就是內(nèi)聯(lián)在方法內(nèi)部的委托對象,它的關(guān)鍵便在于形成了一個閉包(委托執(zhí)行時所需的上下文)。如上面的代碼中,BeginGetResponse的***個參數(shù)(委托)可以直接使用TestRequest方法的參數(shù)url,以及方法內(nèi)的“局部”變量request。如果沒有匿名函數(shù)這個特性的話,代碼寫起來就麻煩了,例如在.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);      }  }

此時,我們往往會發(fā)現(xiàn),開發(fā)人員需要花費大量的精力,為一小部分代碼維護一大段上下文。例如在這段代碼中,我們會將url和request對象塞入一個object數(shù)組中,在回調(diào)函數(shù)中再通過危險的Cast操作恢復數(shù)據(jù)。如果您希望“強類型”,那么只能為每個回調(diào)創(chuàng)建一個新的上下文對象,維護起來可能更加麻煩——要知道,在并行編程,異步調(diào)用越來越重要的今天,如果沒有匿名方法自動保留上下文的特性,開發(fā)人員會為這些“額外工作”疲于奔命的。

可能您會說,匿名方法的可讀性不佳,因為需要“內(nèi)聯(lián)”。一個方法中內(nèi)聯(lián)太多,維護成本就上去了,所以匿名方法并不推薦使用。我想說的是,您錯了。如果為了可維護性,要將方法獨立拆開,也可以利用匿名方法的優(yōu)勢:

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委托不同版本怎么寫”有了更深的了解,不妨來實際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進入相關(guān)頻道進行查詢,關(guān)注我們,繼續(xù)學習!

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI