日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪(fǎng)問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) >

程序员委托事件学习随笔

發(fā)布時(shí)間:2025/7/14 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 程序员委托事件学习随笔 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

委托的聲明
  public delegate void MyDelegate(string str);

  委托是一種特殊的類(lèi)型(class),用途是來(lái)實(shí)現(xiàn)對(duì)一種方法的封裝。在某種事件發(fā)生時(shí),自動(dòng)調(diào)用該方法。好處顯然易見(jiàn),它使用戶(hù)可以自定義自己的方法實(shí)現(xiàn),通過(guò)封裝,CLR會(huì)在相應(yīng)事件激發(fā)時(shí)調(diào)用你定義的方法,實(shí)現(xiàn)你的功能。
  注
  1.委托的定義和方法的定義類(lèi)似,只是在前面加了一個(gè)delegate,但委托不是方法,它是一種類(lèi)型。是一種特殊的類(lèi)型,看成是一種新的對(duì)象類(lèi)型比較好理解。用于對(duì)與該委托有相

  同簽名的方法調(diào)用。
  2.委托相當(dāng)于C++中的函數(shù)指針,但它是類(lèi)型安全的。
  3.委托是從System.Delegate派生,但不能象定義常規(guī)類(lèi)型一樣直接從System.Delegate派生,對(duì)委托的聲明只能通過(guò)上面的聲明格式進(jìn)行定義。關(guān)鍵字delegate通知編譯器這是一

  個(gè)委托類(lèi)型,從而在編譯的時(shí)候?qū)υ擃?lèi)進(jìn)行封裝,對(duì)這一過(guò)程C#定義了專(zhuān)門(mén)的語(yǔ)法來(lái)處理這一過(guò)程。
  4.不能從一個(gè)委托類(lèi)型進(jìn)行派生,因?yàn)樗彩悄J(rèn)sealed的
  5.委托即可以對(duì)靜態(tài)方法進(jìn)行調(diào)用也可以對(duì)實(shí)例方法進(jìn)行調(diào)用。
  6.每個(gè)委托類(lèi)型包含一個(gè)自己的調(diào)用列表,當(dāng)組合一個(gè)委托或從一個(gè)委托中刪除一個(gè)委托時(shí)都將產(chǎn)生個(gè)新的調(diào)用列表。
  7.兩個(gè)不同類(lèi)型的委托即使它們有相同的簽名和返回值,但還是兩個(gè)不同類(lèi)型的委托。但其實(shí)在使用中可看作是相同的。

  委托的比較

  C#中對(duì)委托定義了兩個(gè)操作符 == 和 !=
  在以下情況下兩個(gè)委托是相等的:
  1.當(dāng)兩個(gè)委托都同時(shí)為null的時(shí)候
  2.當(dāng)兩個(gè)委托都不為null時(shí),下列情況下是相等的。
  a.當(dāng)兩個(gè)委托的各自的調(diào)用列表只含有一個(gè)入口點(diǎn)的時(shí)候
  在下列情況下是相等的
  (1) 調(diào)用同一對(duì)象的同一靜態(tài)方法
  (2) 調(diào)用同一對(duì)象的同一實(shí)例方法
  b.當(dāng)兩個(gè)委托具有多個(gè)入口點(diǎn)時(shí)
  在下列情況下是相等的
  (1)只有當(dāng)它們調(diào)用列表中的調(diào)用的方法按順序都一一對(duì)應(yīng)相同的對(duì)象及對(duì)象的同一方法的時(shí)候

  如上所述的兩個(gè)不同類(lèi)型的委托但是它們具有相同的簽名和返回值時(shí),只要滿(mǎn)足上述條件的,即使它們類(lèi)型不同,但比較的結(jié)果也是相同的。

  委托的異常處理

  當(dāng)調(diào)用該委托的方法中發(fā)生了異常時(shí),首先在調(diào)用該委托的方法中搜尋catch語(yǔ)句塊。如果沒(méi)有,則去該委托調(diào)用的方法中去尋找有沒(méi)有catch語(yǔ)句塊,這和調(diào)用方法發(fā)生異常的處

  理是一樣的。

  當(dāng)調(diào)用一個(gè)為null的委托即委托中列表中不存在調(diào)用方法時(shí),將發(fā)生NullRefrenceException

  委托的注意點(diǎn):
  當(dāng)一個(gè)委托有多個(gè)入口點(diǎn)的時(shí)候,調(diào)用委托將依該委托的調(diào)用列表中的方法的順序依次調(diào)用.這些方法共享一個(gè)參數(shù)集合,所以當(dāng)委托有返回值的時(shí)候調(diào)用完這個(gè)委托后的返回值是最

  后一個(gè)方法的返回值或是有out參數(shù).如果該委托的參數(shù)為ref(引用類(lèi)型),那么在招待第一個(gè)方法的時(shí)候如果對(duì)這個(gè)參數(shù)的值有所改變,那么這個(gè)改變將會(huì)影響到后面的方法調(diào)用.

  委托的一個(gè)例子

  using System;
  using System.Collections.Generic;
  using System.Text;

  namespace ConsoleApplication1
  {
  class Program
  {
  static void Main(string[] args)
  {
  // 創(chuàng)建一個(gè)委托實(shí)例,封裝C類(lèi)的靜態(tài)方法M1
  MyDelegate d1 = new MyDelegate(C.M1);
  d1("D1"); // M1

  // 創(chuàng)建一個(gè)委托實(shí)例,封裝C類(lèi)的靜態(tài)方法M2
  MyDelegate d2 = new MyDelegate(C.M2);
  d2("D2"); // M2

  // 創(chuàng)建一個(gè)委托實(shí)例,封裝C類(lèi)的實(shí)例方法M3
  MyDelegate d3 = new MyDelegate(new C().M3);
  d3("D3"); //?M3

  // 從一個(gè)委托d3創(chuàng)建一個(gè)委托實(shí)例
  MyDelegate d4 = new MyDelegate(d3);
  d4("D4"); // M3

  // 組合兩個(gè)委托
  MyDelegate d5 = d1 + d2;
  d5 += d3;
  d5("D5"); // M1,M2,M3

  // 從組合委托中刪除d3
  MyDelegate d6 = d5 - d3;
  d6("D6"); // M1,M2
  d6 -= d3; // 雖然d6調(diào)用列表中已經(jīng)沒(méi)有d3了,但這樣只是不可能的移除沒(méi)有錯(cuò)誤發(fā)生
  d6("D6"); // M1,M2
  d6 -= d6;
  //d6("D6"); 此時(shí)d6的調(diào)用列表為空,d6為null,所以引發(fā)System.NullReferenceException

  MyDelegate d7 = new MyDelegate(C1.P1);
  d7("D7"); // C1.P1

  MyDelegate d8 = new MyDelegate(new C2().P1);
  d8("D8"); // C2.P1

  }
  }

  // 聲明一個(gè)委托MyDelegate
  public delegate void MyDelegate(string str);

  public class C
  {
  public static void M1(string str) //C類(lèi)中的靜態(tài)方法M1(加上了static)
  {
  Console.WriteLine("From:C.M1: ", str);
  }

  public static void M2(string str)
  {
  Console.WriteLine("From:C.M2: ", str);
  }

  public void M3(string str)
  {
  Console.WriteLine("From:C.M3: ", str);
  }
  }

  public class C1
  {
  public static void P1(string str)
  {
  Console.WriteLine("From:C1.P1: ", str);
  }
  }

  public class C2
  {
  public void P1(string str)
  {
  Console.WriteLine("From:C2.P1: ", str);
  }
  }
  }

  事件委托

  事件概述

  事件就是當(dāng)對(duì)象或類(lèi)狀態(tài)發(fā)生改變時(shí),對(duì)象或類(lèi)發(fā)出的信息或通知。發(fā)出信息的對(duì)象或類(lèi)稱(chēng)為"事件源",對(duì)事件進(jìn)行處理的方法稱(chēng)為"接收者",通常事件源在發(fā)出狀態(tài)改變信息時(shí),它并不知道由哪個(gè)事件接收者來(lái)處理.這就需要一種管理機(jī)制來(lái)協(xié)調(diào)事件源和接收者,C++中通過(guò)函數(shù)指針來(lái)完成的.在C#中事件使用委托來(lái)為觸發(fā)時(shí)將調(diào)用的方法提供類(lèi)型安全的封裝

  事件的聲明

  1.聲明一個(gè)委托
  public delegate void EventHandler(object sender, System.EventArgs e);

  2.聲明一個(gè)事件
  public event EventHandler Changed;

  3.引發(fā)一個(gè)事件
  public OnChanged(EnventArgs e)
  {
  if ( Changed != null)
  {
  Changed(this,e);
  }
  }

  4.定義事件處理程序
  public MyText_OnChanged(Object sender,EventArgs e)

  5.訂閱事件(將事件處理程序添加到事件的調(diào)用列表中)

  myText.Changed += EventHandler(MyText_OnChanged);

  下面的一個(gè)小例子說(shuō)明了怎樣定義一個(gè)完整的事件機(jī)制:

  using System;
  using System.Collections.Generic;
  using System.Text;

  namespace ConsoleApplication1
  {
  class Program
  {
  static void Main(string[] args)
  {
  MyText myText = new MyText();

  // 將事件處理程序添加到事件的調(diào)用列表中(即事件布線(xiàn))
  myText.Changed += new MyText.ChangedEventHandler(myText_Changed);

  string str = "";
  while (str != "quit")
  {
  Console.WriteLine("please enter a string:");
  str = Console.ReadLine();
  myText.Text = str;
  }
  }

  // 對(duì)Change事件處理的程序
  private static void myText_Changed(object sender, EventArgs e)
  {
  Console.WriteLine("text has been changed :n" ,((MyText)sender).Text);
  }
  }

  public class MyText
  {
  private string _text = "";

  // 定義事件的委托
  public delegate void ChangedEventHandler(object sender, EventArgs e);

  // 定義一個(gè)事件
  public event ChangedEventHandler Changed;

  // 用以觸發(fā)Change事件
  protected virtual void OnChanged(EventArgs e)
  {
  if (this.Changed != null)
  this.Changed(this, e);
  }

  // Text屬性
  public string Text
  {
  get { return this._text; }
  set
  {
  this._text = value;
  // 文本改變時(shí)觸發(fā)Change事件
  this.OnChanged(new EventArgs());
  }
  }
  }
  }

轉(zhuǎn)載于:https://www.cnblogs.com/yanmengyan/p/10390124.html

總結(jié)

以上是生活随笔為你收集整理的程序员委托事件学习随笔的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。