c# 事件

 

 

已有系统事件的使用:

 class Program
    {      
        static void Main(string[] args)
        {
            Form b = new Form();
            MyForm c = new MyForm(b);
            c.myform.ShowDialog();
        }
    }

  public  class MyForm
    {
        public Form myform;
        public Button mybutton;
      public  MyForm( Form a)
        {
            this.myform = a;
            this.mybutton = new Button();
            mybutton.Text = "bt";
            //form面板里面添加控件
            myform.Controls.Add(mybutton);
            //声明事件,+=方法名
            mybutton.Click +=Myclick ;
        }
        /// <summary>
        /// 事件处理器,vs自动填充
        /// </summary>
        /// <param name="sender">事件拥有者</param>
        /// <param name="e">事件参数</param>
        public void Myclick(object sender, EventArgs e)
        {
            MessageBox.Show("ok");
        }

    }

  自定义事件使用:

1.首先要定义一个委托
2.再用这个委托定义一个事件
3.在这个类里面写上执行事件的方法(因为不可以直接在这个类以外的地方调用)
4.使用+=的方法去添加事件(先要实例化这个类,然后,实例化好的类.事件+=new 类.委托(执行要执行的方法))
5.调用这个类里面执行事件的函数

Eventhandler是系统预设的委托类型,一般用这个就可以了。不用自定义

事件的触发函数一般应为protect或者private,防止事例违法访问

public:公有访问,不受任何限制。

private:私有访问,只限于本类成员访问,子类、实例都不能访问。

protected:保护访问,只限于本类和子类访问,实例不能访问。

internal:内部访问,只限于本项目内访问,其他不能访问。

 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace ConsoleApp1
{

    //点菜的例子
    //声明一个点菜的事件委托,一般不需要,系统再带eventhandler就够用
    public delegate void OderEventHandler(object order, EventArgs args);
    class Program
    {
        public static void Main(string[] args)
        {
            Console.WriteLine("顾客进入...请您点菜");
            string ordername = Console.ReadLine();
            int count = Convert.ToInt32(Console.ReadLine());
            //展示
            Waiter waiter = new Waiter(ordername, count);

            waiter.Show();
            //给厨房下单
            ChuFang chufang = new ChuFang();
            //事件的约定
            waiter.ToMakeEvent += chufang.Order_makecf;
            //事件的触发,只能是拥有者waiter触发
            waiter.Action();

            Console.ReadLine();
        }
        /// <summary>
        /// 自定义事件参数
        /// </summary>
        public class OrderEventArgs : EventArgs
        {
            public string DishName { get; set; }
            public int Count { get; set; }
        }

        /// <summary>
        /// 服务员类
        /// </summary>
        public class Waiter
        {
            public string Ordername { get; set; }
            public int Count { get; set; }

            //事件,本质是委托字段的蒙版,只保留add和remove方法
            public event OderEventHandler ToMakeEvent;

            /// <summary>
            /// 构造函数
            /// </summary>
            /// <param name="ordername">菜名</param>
            /// <param name="count">数量</param>
            public Waiter(string ordername, int count)
            {
                this.Ordername = ordername;
                this.Count = count;
            }

            public void Show()
            {
                Console.WriteLine($"您点是{this.Ordername},数量为{this.Count}");
            }

            //事件只能内部触发,外部调用事件的字段只能连接+=或者—=操作,
            //如果是委托字段那就可以外部调用委托方法,所以说事件更安全,事件是委托蒙版只保留add和remove的方法
            /// <summary>
            /// 事件触发函数的防火墙
            /// </summary>
            public void Action()
            {
                Console.WriteLine("正在向厨房下单,稍等...");
                OnAction();
            }
            /// <summary>
            ///事件触发函数,修饰为protect或者private只能本类内部访问,实例不能访问
            /// </summary>
            private void OnAction()
            {
                //参数eventargs类,传入
                OrderEventArgs orderargs = new OrderEventArgs
                {
                    Count = Count,
                    DishName = Ordername
                };
                //触发事件,object一般为this

                ToMakeEvent?.Invoke(this, orderargs);

            }

        }
        //厨房接受参数,进行处理
        public class ChuFang
        {

            public void Order_makecf(object o, EventArgs e)
            {
                //as进行类型强制转换,不成功则null,如果不想转换,参数直接用OrderEventArgs e
                OrderEventArgs e2 = e as OrderEventArgs;
                OrderEventArgs d2 = o as OrderEventArgs;
                Console.WriteLine($"后厨已经收到订单 {e2.DishName},数量为{e2.Count},正在制作...");


            }

        }
    }
}

 

 

lamd一次性写法:

 

posted @ 2022-05-10 13:13  遥月  阅读(86)  评论(0)    收藏  举报