中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

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

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

.NET中怎么將事件視為對象

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

這篇“.NET中怎么將事件視為對象”文章的知識點大部分人都不太理解,所以小編給大家總結了以下內容,內容詳細,步驟清晰,具有一定的借鑒價值,希望大家閱讀完這篇文章能有所收獲,下面我們一起來看看這篇“.NET中怎么將事件視為對象”文章吧。

將事件視為對象,有的時候就是把事件的級別進行了提升,這樣就能有效地提高語言的抽象能力。有的時候會出現錯誤,但還是值得嘗試的。

如果一個語言(平臺)把事件視為對象,則表明它把“事件”作為了語言的一等公民來對待。這意味著,我們可以把一個單獨的事件作為參數傳遞給方法,也可以將其作為一個對象的一部分,這有效地提高語言的抽象能力。試想,如果沒有“委托”,在.NET中就無法把“方法”看作是對象,也就很難使用如今各種靈活的抽象方式。同樣,由于.NET本身無法將事件作為單個對象處理,因此在某些時候就會束手束腳,也難以引入一些特別的編程模型。

這就是“把事件作為對象進行傳遞”的實際意義。

我們提出了一種“解決方案”,它允許我們編寫這樣的代碼:

class Program  {  public event EventHandler Submit;     static void Main(string[] args)  {  Program p = new Program();  var ev = EventFactory.Create(() => p.Submit);  ev += (sender, eventArgs) => Console.WriteLine(sender);     p.Submit("Hello World", EventArgs.Empty);     Console.WriteLine("Press any key to exit...");  Console.ReadLine();  }  }

看上去挺那么像回事兒的,使用方式和傳統的事件似乎沒有太大區別。但是文末我提到這里其實有些“糊弄”的意味,而我們的裝配腦袋同學、以及“腦袋裝配得不輸給裝配腦袋”的RednaxelaFX,這兩位純爺們也都指出了問題。

信腦袋,得永生。信RednaxelaFX,原地滿狀態復活。

以上代碼的“忽悠”,在于操作Program.Submit的代碼處于Program類之內。如果我們想要使用相同的做法操作其他類的事件就做不到了,例如:

public class MyClass  {  public event EventHandler MyEvent;  }   class Program  {  static void Main(string[] args)  {  var myClass = new MyClass();  var ev = EventFactory.Create(() => myClass.MyEvent);  }  }

這樣的代碼看似沒有問題,但是編譯器會提示這樣的錯誤:

The event 'SimpleConsole.MyClass.MyEvent' can only appear on the left hand side of += or -= (except when used from within the type 'SimpleConsole.MyClass')

編譯器告訴我們,除了在MyClass類的內部,MyEvent事件只能出現在+=或-=操作的左邊。之前提到的兩位純爺們在前文的評論中也有過相關及衍生的討論。因此,我們目前的做法是失敗的。

前文的評論中還有朋友提到,我們事實上也可以把一個事件作為參數傳遞給一個方法(然后在方法里添加或刪除處理程序),只要使用ref關鍵字就可以了,例如:

static void RegisterHandlers(ref EventHandler e) { ... }

然后:

static void Main(string[] args)  {  var myClass = new MyClass();  RegisterHandlers(ref myClass.MyEvent);  }

不過很顯然,這樣的做法也會遇到相同的問題:除非是Program內部的事件,我們不能把它像一個委托對象那樣傳遞。而且,即使可以傳遞,我們也只能為它添加或刪除處理函數,而不能把它作為另一個對象的一部分,然后經過各種處理之后,還可以對這個事件進行操作。

因此,我們要實現的其實是這樣一個類型:

public class DelegateEvent  {  ...   public DelegateEvent AddHandler(TDelegate handler) { ... }   public DelegateEvent RemoveHandler(TDelegate handler) { ... }  } 

以上就是關于“.NET中怎么將事件視為對象”這篇文章的內容,相信大家都有了一定的了解,希望小編分享的內容對大家有幫助,若想了解更多相關的知識內容,請關注億速云行業資訊頻道。

向AI問一下細節

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

AI

加查县| 大余县| 航空| 姜堰市| 句容市| 周口市| 武冈市| 临澧县| 信宜市| 广丰县| 于田县| 洪江市| 乌拉特中旗| 天气| 乳山市| 曲周县| 遵义县| 吉木萨尔县| 宜都市| 内江市| 曲麻莱县| 四子王旗| 新绛县| 罗田县| 漳浦县| 那曲县| 康定县| 都江堰市| 常宁市| 通河县| 方山县| 墨竹工卡县| 洱源县| 沁阳市| 孟连| 稻城县| 繁昌县| 甘孜| 岑溪市| 泰来县| 普定县|