1. 程式人生 > 實用技巧 >學習c#(第9天):理解c#中的事件(一種見解)

學習c#(第9天):理解c#中的事件(一種見解)

表的內容 目錄介紹路線圖我們的話題調查。net Windows應用程式按鈕單擊事件(案例研究)幕後publisher-subscriber模型弄髒你的手:建立自定義事件程式碼解釋結論 介紹 事件的核心和重要概念之一c#程式設計環境和坦白地說有時很難理解他們沒有適當的解釋和例子。 所以我想寫這篇文章的方便學習者和初學者。 圖片來源:http://d.wildapricot.net/images/newsblog/bigstock - 19983578. jpg?sfvrsn=0事件 路線圖 讓我們再次修改我們的路線圖, 潛水在OOP(第一天):多型和繼承(早期繫結/編譯時多型)潛水在OOP(第二天):多型和繼承(繼承)潛水OOP(第三天):多型和繼承(動態繫結/執行時多型)潛水在OOP(第四天):多型和繼承(關於Abstarct類在c#中)潛水在OOP(第五天):都是用c#訪問修飾符(公共/私人/保護/內部/密封/常量/只讀的欄位)學習c#(6天):理解列舉在c#中(一個實際的方法)學習c#(7天):用c#屬性(一個實際的方法)學習c#(8天):用c#索引器(一個實際的方法)學習c#(9天):瞭解c#事件(Insight)學習c#(第十天):代表在c#中(一個實際的方法)學習c#(11天):c#事件(一個實際的方法) 我們的話題 一個事件在一個非常簡單的語言是一個行動或事件,如點選按鍵,滑鼠移動,或系統生成的通知。應用程式可以響應事件時發生。事件訊息傳送的物件來表示事件的發生。事件是一個有效的程序間通訊。他們對一個物件是有用的,因為它們提供訊號狀態改變,這可能是物件的有價值的客戶。 如果上面的句子很難理解我們把這個簡單的如果在形式被使用者點選一個按鈕會觸發一個事件,如果一個使用者型別文字框鍵被按下,因此會觸發一個事件等等。 從MSDN的解釋, ”事件在c#中是一個類的方式向客戶提供通知類的一些有趣的事情發生在一個物件。最熟悉的用於在圖形使用者介面事件;一般來說,表示控制元件的類介面的事件通知當用戶做了一些控制(例如,單擊一個按鈕)。 事件,然而,不需要只用於圖形化介面。事件通常提供一個有用的訊號狀態更改為物件,物件的客戶可能是有用的。事件是一個重要的構建塊建立類,可以在大量不同的程式中重用。 使用代表事件的宣告。如果您尚未研究代表教程,在繼續之前你應該這樣做。回想一下,一個委託物件封裝一個方法,以便它可以被稱為匿名。一個事件是一個類的方法讓客戶給它代表的方法應該被稱為當事件發生時。當事件發生時,委託(s)給它的客戶呼叫。” 下圖是廣義表示解釋事件和事件處理。 在c#中,代表們使用事件來實現事件處理。. net框架繫結事件模型使用代表通知被稱為事件處理程式與方法。生成事件時,委託呼叫關聯的事件處理程式。 調查。net Windows應用程式按鈕單擊事件(案例研究) 開啟你的visual studio和建立一個windows應用程式。你會得到一個名為Form1.cs的形式在你的windows應用程式專案。新增一個簡單的按鈕,表單,就拖拽。在屬性面板的按鈕,繫結按鈕的單擊事件與事件程式碼,點選顯示一些文字。您可以瀏覽附件原始碼的理解。 現在當你執行應用程式時,表單將顯示只有一個按鈕,單擊該按鈕,看看會發生什麼, 我們可以看到表單上的按鈕被點選的使用者,因此按鈕單擊事件被解僱,是由委託反過來叫button_click方法(事件處理程式方法)顯示訊息框。 在上面示例事件宣告,事件處理程式委託宣告,宣告所有由。net我們只需要編寫程式碼處理事件在這種情況下,程式碼來顯示訊息框。 在窗簾後面 如果我們調查Form1.Designer.cs和遵循以下步驟如圖我們可以很容易地發現事件的關鍵字和委託關鍵詞,從而找出它們的定義。 因為我們還沒有看到定義的語法可能看起來陌生但我們會但是現在不久就遵循的步驟圖。 步驟1:開啟Form1.Designer.Cs解決方案資源管理器 步驟2:在Form1.Designer.Cs單擊事件和事件委託。 第三步:雙擊this.button1。單擊並按F12檢視點選事件定義,同樣雙擊系統。EventHandler並按F12看到EventHandler委託定義。 事件的定義, 委託的定義, Publisher-Subscriber模型 事件在一個類宣告長大並與事件處理程式相關聯的使用代表在同一類或其他類。事件是一個類的一部分,同樣的類是用於釋出事件。然而,其他類可以接受這些事件或換句話說可以訂閱這些事件。使用事件釋出者和訂閱者模型。 , 一個出版商的定義是一個物件,其中包含事件和委託。協會委託的事件也是出版商中指定的類。出版商類的物件呼叫事件,通知到其他物件。 使用者是一個物件,想接受事件並提供一個事件處理程式。委託的出版商使用者類的類呼叫方法。這種方法在使用者類是事件處理程式。釋出者和訂閱者模型實現可以由相同的類定義。 代表在c#中發揮非常重要的作用,它是一個實體可以直接放到一個類的名稱空間。這個質量委託就可以訪問所有其他類。代表工作面向物件模式,試圖遵循由封閉方法和物件封裝在一起。用c#委託System.Delegate定義一個類,並使用名稱空間。代表理想的匿名方法呼叫。我將更詳細地討論事件和代表在我即將到來的文章。 下圖顯示了使用的機制出版商和使用者物件。 讓你的手髒:建立自定義事件 讓我們把我們的手髒通過構建我們自己的事件處理的例子。在下面的例子中我們將看到如何定義定製的事件以及如何提高,如何處理我們自己的定製的事件處理器。 在我們的簡單示例中,我們將構建一個控制檯應用程式的銀行,在一個事件TransactionMade提高每當客戶事務和響應通知傳送給他。 現在讓我們做一些嚴肅的編碼。 首先我們定義類賬戶。 我們可以新增一個建構函式來初始化變數int BalanceAmount我們班上將帳戶餘額。 隱藏,複製Code

public int BalanceAmount;
 public Account(int amount)
 {
     BalanceAmount = amount;
 }

然後我們定義事件和委託。 事件釋出者類的定義(Account類)包括委託宣言以及基於委託事件的宣告。下面的程式碼定義一個委託名叫TransactionHandler TransactionMade事件,呼叫TransactionHandler委託時提出: 隱藏,複製Code

 public delegate void TransactionHandler(object sender,TransactionEventArgs e);
public
event TransactionHandler TransactionMade;

如你所見,我們委託的名稱是TransactionHandler,其簽名包含一個void返回值和物件和TransactionEventArgs型別的兩個引數。如果您想要例項化這個委託地方,函式作為建構函式傳遞引數應該有相同的簽名這個委託。 引發事件時我們通過一些資料來源於使用者在一個類。例如,在我們的示例中我們想提供事務數量和型別的事務。所以我們定義了一個類TransactionEventArgs將繼承的EventArgs傳遞資料使用者類。我們已經宣佈兩個私有變數一個int _transactionAmount通過交易數量和其他資訊字串_transactionType事務型別(信用卡/借記卡)資訊傳遞給使用者類。 這是類定義: 隱藏,複製Code

public class TransactionEventArgs : EventArgs
  {
      public int TranactionAmount { get; set; }
      public string TranactionType { get; set; }

      public TransactionEventArgs(int amt, string type)
      {
          TranactionAmount = amt;
          TranactionType = type;
      }
  }

現在,一切都在我們的帳戶類。現在我們將定義我們的通知方法將呼叫信用或借記卡交易,提高我們的事件。 在借方方法平衡數量將扣除和事件將提高通知使用者平衡數量改變了,同樣的信貸餘額方法將會認為和通知將被髮送到使用者類。 付款方法 隱藏,複製Code

public void Debit(int debitAmount)
       {
           if (debitAmount < BalanceAmount)
           {
               BalanceAmount = BalanceAmount - debitAmount;
               TransactionEventArgs e = new TransactionEventArgs(debitAmount,"Debited");
               OnTransactionMade(e); // Debit transaction made
           }
       }

信貸的方法 隱藏,複製Code

public void Credit(int creditAmount)
   {

       BalanceAmount = BalanceAmount + creditAmount;
       TransactionEventArgs e = new TransactionEventArgs(creditAmount,"Credited");
        OnTransactionMade(e); // Credit transaction made

   }

正如你所看到的在上述方法我們已經建立了例項TransactionEventArgs我們通過例項OnTransactionMade()方法,並稱之為。你一定在想什麼OnTransactionMade()是在這裡做的這是我們的方法提高我們的事件。這是它的定義: 隱藏,複製Code

protected virtual void OnTransactionMade(TransactionEventArgs e)
   {
       if (TransactionMade != null)
       {
           TransactionMade(this, e); // Raise the event
       }
   }

下面是我們的賬戶類的完整程式碼: 隱藏,收縮,複製Code

namespace EventExample
{
 public delegate void TransactionHandler(object sender,TransactionEventArgs e); // Delegate Definition
    class Account
    {
        public event TransactionHandler TransactionMade; // Event Definition

        public int BalanceAmount;

       public Account(int amount)
        {
            this.BalanceAmount = amount;
 
        }

        public void Debit(int debitAmount)
        {
            if (debitAmount < BalanceAmount)
            {
                BalanceAmount = BalanceAmount - debitAmount;
                TransactionEventArgs e = new TransactionEventArgs(debitAmount,"Debited");
                OnTransactionMade(e); // Debit transaction made
            }
        }

        public void Credit(int creditAmount)
        {

            BalanceAmount = BalanceAmount + creditAmount;
            TransactionEventArgs e = new TransactionEventArgs(creditAmount,"Credited");
             OnTransactionMade(e); // Credit transaction made
            
        }

        protected virtual void OnTransactionMade(TransactionEventArgs e)
        {
            if (TransactionMade != null)
            {
                TransactionMade(this, e); // Raise the event 
            }
        }
    }

提高一個事件是通過呼叫事件TransactionMade (e),; 這個事件將由我們的事件處理器處理。 現在讓我們定義訂閱者類,它將對事件作出反應,並通過自己的方法相應地處理事件。 首先建立一個名為TestMyEvent的類並定義一個方法SendNotification,它的返回型別和引數應該與之前在publisher類中宣告的委託相匹配。基本上,這個方法會在我們的餘額發生變化時做出反應,並通知使用者(通過在控制檯寫這個)。 下面是定義: 隱藏,複製Code

private static void SendNotification(object sender, TransactionEventArgs e)
    {
        Console.WriteLine("Your Account is {0} for Rs.{1} ", e.TranactionType, e.TranactionAmount);
     }

現在在訂閱者類的Main()方法中建立例項並傳遞一些初始餘額。然後,將事件處理程式的引用傳遞給事件,並將在該事件響應上呼叫的方法傳遞給事件處理程式。 隱藏,複製Code

private static void Main()
       {
           Account MyAccount = new Account(10000);
           MyAccount.TransactionMade += new TransactionHandler(SendNotification);
           MyAccount.Credit(500);
           Console.WriteLine("Your Current Balance is : " + MyAccount.BalanceAmount);
           Console.ReadLine();


       }

因此,下面是訂閱者類(TestMyEvent)的完整定義: 隱藏,複製Code

class TestMyEvent
    {
        
        private static void SendNotification(object sender, TransactionEventArgs e)
        {
      Console.WriteLine("Your Account is {0} for Rs.{1} ", e.TranactionType, e.TranactionAmount);
 
        }

        private static void Main()
        {
            Account MyAccount = new Account(10000);
            MyAccount.TransactionMade += new TransactionHandler(SendNotification);
            MyAccount.Credit(500);
            Console.WriteLine("Your Current Balance is : " + MyAccount.BalanceAmount);
            Console.ReadLine();

        }
    }

我們的輸出將是: 程式碼的解釋 在我們的示例中我們的帳戶類是通知的出版商賬戶餘額的變化如果借方或貸方可以看到從程式碼我們提出了事件在借方/貸方方法如果事件被提升到一定高度,然後有人採取行動所以TestMyEvent類是使用者類的借方/貸方交易因此帳戶餘額的變化因此它被通知從出版商類和它的工作取決於它和處理事件通過呼叫事件處理程式方法SendNotification。因此,很明顯,事件可以在一個類(Publisher)中定義,幾個訂閱者類可以根據自己的需要對其進行操作。 結論 我們研究了。net事件,構建了我們自己的定製事件,並瞭解了事件是如何引發和處理的。所以說事件封裝了委託,委託封裝了方法,這是正確的。因此,subscriber類不需要知道幕後發生了什麼,它只需要publisher類通知事件已經引發,並必須作出相應響應。 我希望您在讀完這篇文章後感到滿意,並且在閱讀和編寫程式碼時感到最愉快。 我的其他系列文章: MVC: http://www.codeproject.com/Articles/620195/Learning-MVC-Part-Introduction-to-MVC-Architectu RESTful webapi: http://www.codeproject.com/Articles/990492/RESTful-Day-sharp-Enterprise-Level-Application 編碼快樂! 本文轉載於:http://www.diyabc.com/frontweb/news2012.html