• c# 事件和委托


        // 1 事件和委托的区别
        // 2 简单的例子
        class Program
        {
            static void Main(string[] args)
            {
                {
                    Cat cat = new Cat();
                    cat.CatMiaoAction += new Dog().Wang;
                    cat.CatMiaoAction += new Mother().Wispher;
                    //cat.CatMiaoAction = null;   允许
                    //cat.CatMiaoAction.Invoke();
                    cat.MiaoDelegate();
                }
                {
                    Cat cat = new Cat();
                    cat.CatMiaoActionHandler += new Dog().Wang;
                    cat.CatMiaoActionHandler += new Mother().Wispher;
                    //cat.CatMiaoActionHandler = null;  event权限限制,不允许声明类外面的操作
                    //cat.CatMiaoActionHandler.invoke();
                    cat.MiaoEvent();
                }
    
                Console.ReadKey();
            }
        }
       public class Dog 
        {
            public void Wang()
            {
                Console.WriteLine("{0} Wang", this.GetType().Name);
            }
        }
       public class Mother
        {
            public void Wispher()
            {
                Console.WriteLine("{0} Wispher", this.GetType().Name);
            }
        }
     public class Cat
        {
            //委托的实例
            public Action CatMiaoAction;
            public void MiaoDelegate()
            {
                Console.WriteLine("{0} MiaoDelegate", this.GetType().Name);
                this.CatMiaoAction?.Invoke();
            }
    
            //事件event:一个委托的实例,带一个event关键字
            //限制权限,只允许在事件声明类里面去invoke和赋值,不允许外面,甚至子类
            //事件和委托的区别与联系? 
            //委托是一种类型,事件是委托类型的一个实例,加上了event的权限控制
            //Student是一种类型,Tony就是Student类型的一个实例,
            public event Action CatMiaoActionHandler;
            public void MiaoEvent()
            {
                Console.WriteLine("{0} MiaoEvent", this.GetType().Name);
                this.CatMiaoActionHandler?.Invoke();
            }
        }

    一个例子

     public class EventStandard
        {
            public static void Show()
            {
                Pig lesson = new Pig()
                {
                    Id = 123,
                    Name = "猪肉价格",
                    Price = 40
                };
                //订阅:把订户和发布者的事件关联起来
                lesson.IncreaseHandler += new Masses().Buy;
                lesson.IncreaseHandler += new TV().Popularize;
                lesson.Price = 50;
            }
    
    
            /// <summary>
            /// 订户:关注事件,事件发生后,自己做出对应的动作
            /// </summary>
            public class Masses
            {
                public void Buy(object sender, EventArgs e)
                {
                    Pig pig = (Pig)sender;
                    Console.WriteLine($"This is {pig.Name} Lesson");
    
                    XEventArgs args = (XEventArgs)e;
                    Console.WriteLine($"之前价格{args.OldPrice}");
                    Console.WriteLine($"现在价格{args.NewPrice}");
                    Console.WriteLine("果断买了!!!");
                }
            }
            public class TV
            {
                public void Popularize(object sender, EventArgs e)
                {
                    Pig pig = (Pig)sender;
                    Console.WriteLine($"This is {pig.Name} Lesson");
    
                    XEventArgs args = (XEventArgs)e;
                    Console.WriteLine($"之前价格{args.OldPrice}");
                    Console.WriteLine($"现在价格{args.NewPrice}");
                    Console.WriteLine("广大用户请留意!!!");
                }
            }
    
            /// <summary>
            /// 事件参数  一般会为特定的事件去封装个参数类型
            /// </summary>
            public class XEventArgs : EventArgs
            {
                public int OldPrice { get; set; }
                public int NewPrice { get; set; }
            }
    
    
            /// <summary>
            /// 事件的发布者,发布事件并且在满足条件的时候,触发事件
            /// </summary>
            public class Pig
            {
                public int Id { get; set; }
                public string Name { get; set; }
    
                private int _price;
                public int Price
                {
                    get
                    {
                        return this._price;
                    }
                    set
                    {
                        if (value > this._price)
                        {
                            this.IncreaseHandler?.Invoke(this,
                                new XEventArgs()
                                {
                                    OldPrice = this._price,
                                    NewPrice = value
                                });
                            this._price = value;
                        }
                    }
                }
    
                /// <summary>
                /// 降价事件
                /// 
                /// </summary>
                public event EventHandler IncreaseHandler;
    
            }
        }
  • 相关阅读:
    v4L2编程
    我的c#开发之路
    JS 获取页面input控件 追加样式属性
    FileUpload控件应用
    C# Winform项目下实现左侧菜单右侧界面显示效果
    在DropDownList 控件绑定数据源中新增一条自定义数据
    在datatable数据中自定义增加一列
    java 实现字符串词频统计
    Hibernate3.x 中BLOB、CLOB 注解配置写法
    lucene 排序
  • 原文地址:https://www.cnblogs.com/wangdash/p/11811757.html
Copyright © 2020-2023  润新知