簡體   English   中英

新運算符如何與C#中的委托一起使用

[英]How new operator works with delegates in C#

在此代碼段中, 新的MyDel(this.WelcomeUser)如何工作? 內存中發生了什么,我知道委托是引用類型,所以在堆中創建了一個對象,它是哪種類型的對象-MyDel 究竟是this.WelcomeUser是什么? 它是對方法的引用嗎?

using System;
namespace SampleApp {
public delegate string MyDel(string str);

class EventProgram {
  event MyDel MyEvent;

  public EventProgram() {
     this.MyEvent += new MyDel(this.WelcomeUser);
  }
  public string WelcomeUser(string username) {
     return "Welcome " + username;
  }
  static void Main(string[] args) {
     EventProgram obj1 = new EventProgram();
     string result = obj1.MyEvent("Tutorials Point");
     Console.WriteLine(result);
  }
 }
}

new MyDel(this.WelcomeUser)如何工作?

這是對構造函數的調用,使用this.WelcomeUser作為參數。

public delegate string MyDel(string str);

是類型定義。 編譯器使用它來生成派生自System.Delegate的類。 請注意,這是在C#具有泛型之前設計的。

究竟是this.WelcomeUser是什么?

它是方法的名稱。 在C#(以及C,C ++等)中,方法始終帶有參數(或參數)列表,即使該列表為空: SomeMethod()
省略列表等同於地址。

當您查看VB.NET時,它變得更加清楚,等效代碼為

MyEvent += new MyDel(this.WelcomeUser);       // C#

AddHandler MyEvent, AddressOf Me.WelcomeUser  ' VB

從C#2開始,您可以使用簡稱:

MyEvent += this.WelcomeUser;       // modern C#

它是對函數的引用嗎?

是的,但是我們通常在C#中將其稱為方法

  • this是指當前班級
  • WelcomeUser引用類中的方法名稱。

new MyDel調用期望提供一個帶有字符串參數並返回字符串的方法的名稱(即與delegate的輸入和輸出匹配的方法)。 任何符合此要求的方法都是可以接受的

在此處輸入圖片說明

看一個事件引發者和使用者處於不同類別的示例可能更有意義:

using System;

public delegate string MyDel(string str);

class EventEmitter {
  event MyDel MyEvent;
}

class EventConsumer{

  private EventEmitter x = new EventEmitter();

  public EventConsumer() {
     x.MyEvent += new MyDel(this.MyEventHandler);
  }

  public string MyEventHandler(string username) {
     return "Welcome " + username;
  }

}

現在,這里的EventConsumer可以知道EventEmitter何時引發事件。 EventEmitter不了解使用者內部的任何方法,它們的名稱等等。.NET運行時將在發射器中調用附加到事件的方法(在使用者中)。 可以附加多個處理程序:

class EventConsumer{

  private EventEmitter x = new EventEmitter();

  public EventConsumer() {
     x.MyEvent += new MyDel(this.MyEventHandler);
     x.MyEvent += new MyDel(this.MyEventHandler2);
  }

  public string MyEventHandler(string username) {
     return "Welcome " + username;
  }
  public string MyEventHandler2(string username) {
     return "Goodbye " + username;
  }

}

引發事件時,它們都將被調用(但不能保證以什么順序)

事件機制很重要,因為它使我們能夠提供一種方法來向其他類發出警報,而無需了解該類。 顯而易見,它的用法類似於Button類-Microsoft不知道在編寫Button時調用按鈕的方法將被調用,因此它們只提供一個名為Click的事件,並且您會附加任何具有兼容簽名的方法來處理用戶按下按鈕時的點擊

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM