亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

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

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

.NET委托不同版本怎么寫

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

本篇內容主要講解“.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委托不同版本怎么寫”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!

向AI問一下細節

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

AI

安西县| 女性| 泰和县| 昌乐县| 民权县| 绥中县| 湘潭市| 天门市| 永丰县| 略阳县| 响水县| 武定县| 枣阳市| 乌苏市| 萍乡市| 云浮市| 蒙自县| 岐山县| 霍林郭勒市| 临沭县| 崇左市| 桐柏县| 佛山市| 西平县| 威海市| 常州市| 朝阳县| 贵南县| 洱源县| 进贤县| 灯塔市| 阜新| 阳山县| 汶上县| 滨州市| 廊坊市| 吐鲁番市| 舞阳县| 苏尼特左旗| 永德县| 昌黎县|