您的位置:威尼斯官方网站 > 威尼斯正规官网 > 对象或者类具备通知能力的成员

对象或者类具备通知能力的成员

发布时间:2019-11-27 17:26编辑:威尼斯正规官网浏览(67)

    本节对事件進展计算。

    二、事件:

    1、概念:伊芙nt:A member that enables an object or class to provide notifications;官方的演讲是如此,正是说在C#中,事件是使

    对象或者类具备布告才干的分子。举个例子说手提式有线电话机接到短信指示本身去开会,那么手提式有线电电话机就出任了一个具备通告技艺的积极分子。说白了,事件

    的功用就是目的和类之间的音信传送的桥梁。

    2、原理:源于产生-响应模型:

    事件源(event source) + 事件小编(event) => 事件的订阅者(event subscriber) + 事件微电脑(event handler)           

    (别的还恐怕有事件的订阅者和事件源之间的订阅关系subscribe relationship)

    依旧以手提式有线电话机选拔短信提醒小编去开会为例,事件源:手机吗,事件:收到短信,事件的订阅者:作者,事件微电脑:去开会,订阅关系:小编订阅手机

    3、事件的宣示:分为详细证明和省略表明:

    (1卡塔 尔(英语:State of Qatar)详细表明:

    public delegate void MyDelegateEventHandler();
        public class Event
        {
            private MyDelegateEventHandler myDelegateEventHandler;
            public event MyDelegateEventHandler MyDelegate
            {
                add
                {
                    this.myDelegateEventHandler += value;
                }
                remove
                {
                    this.myDelegateEventHandler -= value;
                }
            }
        }
    

    (2卡塔 尔(英语:State of Qatar)简略表明:

    public delegate void MyDelegateEventHandler();
        public class Event
        {
             public event MyDelegateEventHandler myDelegate;
        }
    

    能够观察,在生机勃勃体化注明中第生机勃勃增添了一个委托项指标字段,然后暴漏了充足和移除事件微机的职能,不过我们平日用的是大致注脚,因为代码更精短,

    能够看出事件对外面掩盖了很多功效,它的本色正是对中间委托字段的八个封装(encapsulation),幸免外部偷用滥用委托字段。

    这就是说难点来了:第叁个难点:有了信托为何还大概有事件呢,事件之中不正是委托吗,原因是为了卫戍public型的委托字段在外边被滥用,比方信托能够用invoke调用,

    不过事件只可以在+=或-=的左边手,那样就大增了一切程序的安全性。

    其次个难题:那委托和事件的关联怎么着的吧?大家说事件是依赖委托的。一方面,事件供给委托来做多个束缚,那几个约束规定了风浪源发送什么供给给事件的订阅者,

    事件订阅者的事件微处理机必需和那个约束相对应才方可订阅那个事件,其他方面,事件订阅者收到事件未来做出事件微处理器,而以这件事件微处理机必需透过信托才方可做到。

    4、简单实例:

    Example:做三个窗口,有文本框和按键,点击按键文本框展现时间,不用WindowsForms

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Windows.Forms;
    
    namespace ConsoleApp14
    {
        class Program
        {
            public static TextBox textBox;
            public static Button button;
            static void Main(string[] args)
            {
                Form form = new Form();
                TextBox textBox = new TextBox();
                Button button = new Button();
                form.Controls.Add(textBox);
                form.Controls.Add(button);
                textBox.Width = 400;
                button.Top = 100;
                button.Click += Button_Click;
                form.ShowDialog();
            }
    
            private static void Button_Click(object sender, EventArgs e)
            {
                textBox.Text = DateTime.Now.ToString();
            }
        }
    }
    

    图片 1

     

    那边举的例子正是windowsforms内部的代码,大家说事件本人是不会时有产生的是由事件源内部的逻辑所接触,在本例中,并不是人按了按键然后按键触发了平地风波,

    那其间还应该有叁个小进程,正是当按键被key down再key up时,向程序内部发送了一异彩纷呈电子通讯号,布告计算机,然后再产惹事变,

    5、注明事件的有关约定:

    用以证明事件的嘱托平常用:事件+EvnetHandler,参数日常有2个,第三个事件源,第1个伊夫ntArgs的派生类,用于触发事件的点子名类同为On+方法名,

    拜候等第Protected。大概有一点蒙,举个实例就懂了。

    Example:举二个买主在KFC点餐的例子

    namespace ConsoleApp15
    {
        class Program
        {
            static void Main(string[] args)
            {
                Customer customer = new Customer();
                Waitor waitor = new Waitor();
                customer.Order += waitor.Serve;
                customer.Eat();
                customer.Pay();
            }
        }
        public delegate void OrderEventHandler(Customer customer, OrderEventArgs e);
        public class Customer
        {
            public int Money { get; set; }
            public event OrderEventHandler Order;
            public void Pay()
            {
                Console.WriteLine($"OK,{Money} dollars");
            }
            public void Eat()
            {
                Console.WriteLine("Let's go to the KFC...");
                Console.WriteLine("Stand in front of the waitor...");
                Console.WriteLine("A hamburger,Please...");
                OnOrder();
            }
            protected void OnOrder()
            {
                OrderEventArgs orderEventArgs = new OrderEventArgs();
                orderEventArgs.Snack = "Hamburger";
                orderEventArgs.Size = "large";
                this.Order.Invoke(this, orderEventArgs);
    
            }
        }
        public class OrderEventArgs : EventArgs
        {
            public string Snack { get; set; }
            public string Size { get; set; }
        }
        class Waitor
        {
            public void Serve(Customer customer, OrderEventArgs e)
            {
                Console.WriteLine($"Here is your snack {e.Snack}");
                int price = 20;
                switch (e.Size)
                {
                    case "large":
                        price *= 2;
                        break;
                    case "small":
                        price *= 1;
                        break;
                    default:
                        break;
                }
                customer.Money += price;
            }
        }
    }
    

    图片 2

     

    依据事件的三个要素,首先需求事件源,做多个Customer类,还必要叁个事件订阅者,做三个Waitor类,然后依据订阅关系去写实际的方式,订阅关系customer.Order += waitor.Serve; Customer点餐Waitor服务,waitor类中上餐并算好价钱,那时须求二个事件微型机Order伊芙ntHandler,这么些委托的参数必要二个Order伊夫ntArgs,创制那些类写好属性,在写好委托和事件,然后在Customer类中写点餐事件,点餐事件为Protected的,和public型的委托字段同样防止被外部滥用,升高安全性。

    想心照不宣其实也不难,只需求将事件的5个要素每三个点数出来,那么最后事件也就出去了。

     

    至那一件事件下结论收尾,有暧昧之处还请指教。                2018-08-17   16:43:19

     

    本文由威尼斯官方网站发布于威尼斯正规官网,转载请注明出处:对象或者类具备通知能力的成员

    关键词: