zoukankan      html  css  js  c++  java
  • C#:代表(delegate)和事件(event) (转)

    代表(delegate):

     它是C#语言里面的函数指针,代表可以指向某一个函数,在运行的时候调用这个函数的实现。下面来看看它的实现步骤:

    1. 声明一个delegate对象。
    2. 实现和delegate具有相同参数和返回值的函数实现(可以是静态和非静态的)。
    3. 产生一个delegate对象的时候,把你刚刚实现的函数作为参数传给他的构造函数。

    请看下面例子:

    using System;
    using System.Collections.Generic;
    using System.Text;

    namespace UsingDelegate
    {
        public delegate void MyDelegate(string mydelegate);//声明一个delegate对象

        public class TestClass
        {

            //实现有相同参数和返回值的函数
            public void HelloDelegate(string mydelegate)
            {
                Console.WriteLine(mydelegate);
            }

           //实现有相同参数和返回值的静态函数

            public static void HelloStaticDelegate(string mystaticdelegate)
            {
                Console.WriteLine(mystaticdelegate);
            }
        }

        class Program
        {
            static void Main(string[] args)
            {
                TestClass testClass = new TestClass();
                MyDelegate mydelegate = new MyDelegate(testClass.HelloDelegate);//产生delegate对象
                mydelegate("Hello delegate");//调用

                MyDelegate myStaticDelegate = new MyDelegate(TestClass.HelloStaticDelegate);//产生delegate对象
                myStaticDelegate("Hello static delegate");//调用
            }
        }
    }

    事件(event):

    让我通过一个例子来模拟事件的整个过程:

    1. 创建一个button类,它里面有一个click 事件。
    2. 创建一个Form类,他里面有一个我们上面定义的button类。
    3. 要求:当我们用户单击button类的时候From类要对他进行处理,输出一条信息“我知道你被单击了”

    请看下图:

    首先我们会单击button,然后button会通知Form,然后From就作出相应。这个过程在C#里面应该怎么做到呢?

    下面我会列出上述例子的源代码(这里就不介绍怎么声明event等等内容了):

    using System;
    using System.Collections.Generic;
    using System.Text;

    namespace UsingEvent
    {
        public delegate void ClickEventHandler(object sender, EventArgs e);//声明一个代表:请看文章最后面Note

        public class MyButton              //创建MyBottom
        {
            public event ClickEventHandler ClickEvent;//声明一个事件

            public void Click()                                 //单击MyButton
            {
                if (ClickEvent != null)
                {
                    Console.WriteLine("MyButton: 我被单击了");
                    ClickEvent(this, null);                          //抛出事件,给所有相应者
                }
            }
        }

        public class MyForm
        {
            public MyButton myButton = new MyButton();

            public MyForm()
            {

                //添加事件到myButton中,当myButton被单击的时候就会调用相应的处理函数

                myButton.ClickEvent += new ClickEventHandler(OnClickEvent);   

             }

           //事件处理函数

           void OnClickEvent(object sender, EventArgs e)
            {
                Console.WriteLine("MyForm: 我知道你被单击了!");
            }
        }

        class Program
        {
            static void Main(string[] args)
            {
                MyForm form = new MyForm();//生成一个MyForm

                form.myButton.Click();//单击MyForm中的鼠标,效果就出来了
            }
        }
    }
     

    Note:public delegate void ClickEventHandler(object sender, EventArgs e);这是事件委托标准的声明方法,其实在参数里面我们可以不传,也可以是其他类型的。但是最好还是使用上面的声明方法,你可以继承EventArgs,来包装你要传送的其他任何参数。 


  • 相关阅读:
    Auto.js 入门教程
    几乎纯css实现弹出框
    php curl访问https 域名接口一直报错的问题
    金山打字通刷打字速度脚本
    centos 安装 图像识别工具 tesseract-ocr 流程
    js 实现俄罗斯方块(三)
    小程序报错 .wxss 无法找到
    Redis存储数组
    问题记录-databinding/hilt踩坑记录
    问题记录-CoordinatorLayout+WebView使用遇到的问题
  • 原文地址:https://www.cnblogs.com/cuihongyu3503319/p/732376.html
Copyright © 2011-2022 走看看