zoukankan      html  css  js  c++  java
  • C#超简单自定义事件

    转载声明:https://www.cnblogs.com/xiii/p/7006901.html

    我知道你为啥点进来,所以不要犹豫了,立刻马上果断创建控制台项目,直接复制下面精干短小而又强大的代码运行: 

    复制代码
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    namespace TestEvent
    {
        class MyEvent //声明事件
        {
            public event EventHandler<EventArgs> OnInput; //定义一个委托类型的事件  
            public void WaitInput()
            {
                while (true)
                {
                    if (Console.ReadLine() == "x")
                        OnInput(this, new EventArgs()); //触发事件
                }
            }
        }
        class Program
        {
            static void Main(string[] args)
            {
                MyEvent Evt = new MyEvent();//实例化
                Evt.OnInput += On_Input; //绑定事件到方法  
                Evt.WaitInput();
            }
    //事件处理方法 private static void On_Input(object sender, EventArgs e) { Console.WriteLine("你触发了‘X’!"); } } }
    复制代码

    输入'x'回车,看效果:

    如果触发事件的时候,想传递点参数怎么办?看来你是一个要求很高的人!请删掉上面的代码,复制下面的进去运行看看:

    复制代码
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace TestEvent
    {
        //事件参数定义
        class MyEventArgs : EventArgs
        {
            char _char;
            string _msg;
            //事件参数重载
            public MyEventArgs(char chr)//当输入内容为字符
            {
                this._char = chr;
            }
            public MyEventArgs(string msg)//当输入内容为字符串
            {
                this._msg = msg;
            }
            //事件属性
            public int Ascii//获取输入的(首字符)ASCII码
            {
                get { return string.IsNullOrEmpty(_msg) ? (int)_char : 0; }
            }
            public char Char//获取输入的(首)字符
            {
                get { return string.IsNullOrEmpty(_msg) ? _char : '?'; }
            }
            public string Msg//获取输入的字符串
            {
                get { return string.IsNullOrEmpty(_msg) ? "Not String!" : _msg; }
            }
        }
        //事件
        class MyEvent
        {
            public event EventHandler<MyEventArgs> OnInput; //定义一个委托类型的事件  
            public void WaitInput()
            {
                while (true)
                {
                    string str = Console.ReadLine();
                    if (str.Length == 1)
                        OnInput(this, new MyEventArgs(str[0])); //触发事件
                    else
                        OnInput(this, new MyEventArgs(str)); //演示不同的参数类型
                }
            }
        }
        class Program
        {
            static void Main(string[] args)
            {
                MyEvent Evt = new MyEvent();//实例化
                Evt.OnInput += On_Input; //绑定事件,也就是触发的方法
                Evt.WaitInput();
            }
            //事件处理方法
            private static void On_Input(object sender, MyEventArgs e)
            {
                Console.WriteLine("输入的内容: " + e.Msg);
                Console.WriteLine("输入的字符: " + e.Char + " (ASCII: " + e.Ascii.ToString() + ")");
            }
        }
    }
    复制代码

    效果:

    然而还有一些道友有着更高更骚的要求,比如使用了很多的类[n],怎么处理事件,怎么判断事件是哪个类触发的?请看下面通过第一个示例修改后的代码:

    复制代码
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    namespace TestEvent
    {
        class MyEvent //声明事件
        {
            public event EventHandler<EventArgs> OnInput; //定义一个委托类型的事件  
            public string MyID { get; set; }
            public void TestInput( string s)
            {
                if(s==MyID)//如果输入的和自己的ID一样,就触发事件
                    OnInput(this, new EventArgs()); 
            }
        }
        class Program
        {
            static void Main(string[] args)
            {
    
                MyEvent[] Evt = new MyEvent[9];//声明
                for (int i = 0; i < Evt.Length; i++)
                {
                    Evt[i] = new MyEvent();//实例化
                    Evt[i].MyID = (i + 1).ToString();//设置ID1~9
                    Evt[i].OnInput += On_Input; //都绑定事件到同一个方法
                }
                while (true)//由于是单线程不能每个都循环,输入监视放到这里来,写成多线程代码增多太绕了
                {
                    string s = Console.ReadLine();
                    foreach (MyEvent me in Evt)
                        me.TestInput(s);//分别提交测试
                }
            }
            //事件处理方法
            private static void On_Input(object sender, EventArgs e)
            {
                string _id = (sender as MyEvent).MyID;//注意这里
                Console.WriteLine("第 " + _id + " 被触发!");
            }
        }
    }
    复制代码

    输入数字后回车看效果:

    最后还剩一个特别说明,专门为好奇心特别重的朋友准备,上面的代码中,绑定事件为啥写成+=?因为...

    Evt.OnInput += On_Input; //绑定事件
    Evt.OnInput -= On_Input; //解绑事件

    6-18:再补充一个简单的例子,在事件处理中设置参数,决定是否退出监听输入:

    复制代码
    //事件参数定义
    class MyEventArgs : EventArgs
    {
        public MyEventArgs(string s) { InputString = s; }
        public string InputString { get; private set; }
        public bool Cancel { get; set; }
    }
    //事件
    class MyEvent
    {
        public event EventHandler<MyEventArgs> OnInput; //定义一个委托类型的事件  
        public void WaitInput()
        {
            while (true)//监视输入的循环
            {
                string str = Console.ReadLine();
                if (!string.IsNullOrEmpty(str))
                {
                    MyEventArgs myevent = new MyEventArgs(str);
                    OnInput(this, myevent); //触发事件
                    if (myevent.Cancel)
                    {
                        Console.WriteLine("退出监听!");
                        break;
                    }
                }
            }
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            
            MyEvent Evt = new MyEvent();    //实例化
            Evt.OnInput += On_Input;        //绑定事件
            Evt.WaitInput();                //监听输入
            Evt.OnInput -= On_Input;        //解绑事件
            Console.ReadLine();
        }
        //事件处理方法
        private static void On_Input(object sender, MyEventArgs e)
        {
            if (e.InputString == "x")
                e.Cancel = true; //设置取消监听
            else
                Console.WriteLine("您输入了:" + e.InputString);
        }
    }
    复制代码

    效果:

    上面的示例修改自网上,机制、原理啥的我也不复制了,太绕了,反正发一大堆文字也没啥人愿意看,还不如简单粗暴直接代码算了。大家都是这么用,无毒无副作用无不良反应。

  • 相关阅读:
    Java实现埃拉托色尼筛选法
    Java实现希尔排序
    Java实现希尔排序
    Java实现希尔排序
    Java实现希尔排序
    Java实现希尔排序
    Java实现插入排序
    Java实现插入排序
    Java实现插入排序
    使用Qt5.7.0 VS2015版本生成兼容XP的可执行程序 good(从VS2012 update1开始支持xp和c++11)
  • 原文地址:https://www.cnblogs.com/pacexdong/p/12536977.html
Copyright © 2011-2022 走看看