C#中标准的事件模式,和观察者模式

整个过程:在事件所有者,即被观察者中定义事件,(方法集合)以及触发方法,触发即可

过程中需要订阅观察者方法,传给他被观察者对象和相关事件参数,

知识点:标准事件void返回,两个参数返回,

官方说法:https://docs.microsoft.com/zh-cn/dotnet/csharp/event-pattern 

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

namespace EventStandardModel
{
   
    /*
     * 官方说的非常清楚,标准事件的委托签名就是长这样,
     * 非常明显它需要一个EventArgs类型,我们可以自定义一个
     void OnEventRaised(object sender, EventArgs args);
     */

    class Program
    {
        static void Main(string[] args)
        {
            TestEvent test = new TestEvent();
           
            // 订阅事件,注册一个方法,
            test.MyEventEventHandler += AnyMethod;

            // 调用触发方法,可它是受保护的方法,到底如何触发呢?
            //这里不是直接调用,而是借助另一个触发点,比如计算完一个数,触发,或是价格属性,改变进行
            //或是搜索文件时触发,宏观的感觉,就是自身动作,将自身一些数据,作为参数传递过去,触发其他对象的行为

            //触发事件
            test.DoneAfterCalculate();
        }
        //这里想起来按钮点击事件,也是长这个样子,发送者即按钮
        static void AnyMethod(object sender, MyEventArgs e)
        {
            Console.WriteLine("计算结果:"+e.MyProperty+"(触发注册的方法,这个方法可以是静态方法,可以是别的对象方法,总之当事件所有者对象,触发,这里注册的方法的触发)");
        }
    }
    //这个参数类型,有自己的属性,方便传递
    public class MyEventArgs : EventArgs {
        public int MyProperty { get; set; }
        public MyEventArgs(int param) {
            MyProperty = param;
        }
    }

    //事件是属于哪个对象,
    public class TestEvent { 

        //!!!!!!!!!!!这里定义标准事件,官方给予另外一种
       //定义一个标准事件,就像定义一般的事件一样,先定义委托,
        //必须无返回值,且拥有两个参数
        //*********第一种:自定义委托,和事件签名
        public delegate void MyEventHandler(object sender,MyEventArgs eventArgs);
        //事件本质仍然是来自多播委托,加上event关键修饰,让它有专属特点,即所有者进行添加移除操作,
        public event MyEventHandler MyEventEventHandler;
        //已经定义一个事件,其实这里相当于定义一个方法集合,

        //*********第二种:自定义委托,和事件签名,一模一样的效果
        //public event EventHandler MyEventEventHandler;

        //写一个触发事件,即调用方法集合,要求受保护的虚方法,这个方法必须以On为前缀,加上事件名(PriceChanged),还要接受一个EventArgs参数,
        //即调用这个集合,一些列特定方法,需要的参数
        protected virtual void OnMyEventEventHandler(MyEventArgs args) { 
            //事件(方法集合)不为空,那么调用即可
            if (MyEventEventHandler!=null)
            {
                //需要两个参数,一个正好是调用者本身,另外传递一个参数
                MyEventEventHandler(this,args);
            }
        }

        public void DoneAfterCalculate() {
            int result = 0;
            for (int i = 0; i < 1000; i++)
            {
                result += i;
            }
            //计算完,触发一下
            OnMyEventEventHandler(new MyEventArgs(result));
        }
       

    }
}

 
     网上有说法是:
    委托是一种在对象里保存方法引用的类型,同时也是一种类型安全的函数指针。或委托可以看成一种表示函数的数据类型,类似函数指针.
    而事件是特殊的委托,
    博主个人理解,将委托视为特定方法集合,更好理解,
    

 

你可能感兴趣的:(c#)