zoukankan      html  css  js  c++  java
  • Explaining Delegates in C#

    In my previous post, I spoke about a few very basic and simple reasons of using delegates - primarily callback. In this post, I'll talk about creating Events using delegates.

    I have tried to annotate the class with comments so that it is easy to comprehend. But IMHO, the best way to figure out what's going on is to copy/paste the following code and create breakpoint in the Main() class and hit F11 to step into the code. You will notice that Events are based on the Observer or Publish/Subscribe design pattern.

    There are 3 rules which are MANDATORY when you are planning to create events...

    Rule 1> The delegate must be defined with two arguments
    Rule 2> These arguments always represent TWO objects… 
                The Publisher (object that raised the event)
                Event Information object
    Rule 3> The 2nd object HAS to be derived from EventArgs

    Step through the code and see for yourself how easy this is!!

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    
    namespace DelegatesAndEvents
    {
        //There are 3 rules which are MANDATORY when you are planning to create events
        //Rule 1> The delegate must be defined with two arguments
        //Rule 2> These arguments always represent TWO objects… 
        //          The Publisher (object that raised the event)
        //          Event Information object
        //Rule 3> The 2nd object HAS to be derived from EventArgs
    
        //To comply with Rule 3 we create a LoggerEventArgs which is derived from EventArgs
        class LoggerEventArgs : EventArgs
        {
            //constructor to initialize the UserName property
            public LoggerEventArgs(string UserName)
            {
                this.username = UserName;
            }
    
            string username;
            public string UserName
            {
                get { return username; }
            }
        };
    
        //To comply with Rule 1 and 2, in the publisher class we created a delegate and event declaration
        class InventoryManager // Publisher
        {
            public delegate void LoggerEventHandler(object source, LoggerEventArgs e);
            public event LoggerEventHandler OnInventoryUpdate;
    
            //This method will fire an event called OnInventoryUpdate whenever called
            public void LogEvent(string username)
            {
                LoggerEventArgs e = new LoggerEventArgs(username);
                if (OnInventoryUpdate != null)
                {
                    Console.WriteLine("LogEvent > Raising events to all subscribers...
    ");
                    OnInventoryUpdate(this, e);
                }
            }
        };
    
        class InventoryLogger // Subscriber
        {
            InventoryManager inventoryManager;
            public InventoryLogger(InventoryManager inventoryManager)
            {
                Console.WriteLine("InventoryWatcher > Subscribing to OnInventoryUpdate event...
    ");
                this.inventoryManager = inventoryManager;
    
                //Wiring the event so that the event is fired
                inventoryManager.OnInventoryUpdate += 
                        new InventoryManager.LoggerEventHandler(OnInventoryUpdate);
            }
    
            void OnInventoryUpdate(object source, LoggerEventArgs e)
            {
                Console.WriteLine("The guy who changed this inventory was... " + e.UserName);
            }
        }
    
        class DelegateEvents
        {
            public static void Main()
            {
                InventoryManager inventoryManager = new InventoryManager();
    
                Console.WriteLine("Main > Instantiating the subscriber... 
    
    ");
                InventoryLogger inventoryLog = new InventoryLogger(inventoryManager);
    
                inventoryManager.LogEvent("Rahul Soni");
                Console.ReadLine();
            }
        };
    }

    In the next post, I will talk about Asynchronous callbacks using delegates.

    转: http://www.dotnetscraps.com/dotnetscraps/post/Explaining-Delegates-in-C-Part-2-(Events).aspx

  • 相关阅读:
    C#获取url中参数键值对的方法
    一款css3很美的iphone注册表单样式
    很震撼的HTML5视频播放器,电影院的感觉
    html5菜单折纸效果
    web服务器之nginx与apache
    安装win8、ubuntu双系统的过程
    新学C#线程使用总结
    人民币大写金额转换C#方法
    可以调整gif动画图片尺寸的很实用的php类
    JS获取html对象的几种方式说明
  • 原文地址:https://www.cnblogs.com/shuaixf/p/3319157.html
Copyright © 2011-2022 走看看