首页 新闻 会员 周边

初学,实例求解指导

0
[已解决问题] 解决于 2020-11-17 21:57

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

namespace _5_8
{
public class EventTest
{
private int value;
public delegate void NumManipulationHandler(); //定义委托NumManipulationHandler
public event NumManipulationHandler ChangeNum; //根据委托定义事件ChangeNum,当数字改变时触发
protected virtual void OnNumChanged() //定义虚方法OnNumChanged
{
if (ChangeNum != null)
{
ChangeNum();
}
else
{
Console.WriteLine("数字发生改变,事件被触发");
}
}
public EventTest(int n)
{
SetValue(n);
}
public void SetValue(int n)
{
if (value != n)
{
value = n;
OnNumChanged(); //数字变化,先赋值再调用OnNumChanged方法
}
}
}
public class MainClass
{
public static void Main()
{
EventTest e = new EventTest(1);
e.SetValue(2);
e.SetValue(3);
Console.ReadKey();
}
}
}
初学,单独委托调用实例看的明白,结合事件的实例没看懂,1、定义委托没跟参数,我怎么知道调用那个方法?
2、没明白事件怎么不是OnNumChanged?
请大侠们指点下

herry507的主页 herry507 | 菜鸟二级 | 园豆:243
提问于:2020-10-01 12:03
< >
分享
最佳答案
0

上面的事件没有被订阅,就不会被触发,而且OnNumChanged方法跟事件没有关系,只是个自定义的虚方法而已,不用它也可以

参考:https://www.cnblogs.com/zhangchenliang/archive/2012/08/08/2629048.html

简单示例

EventTest.cs

    public delegate void NumManipulationHandler(int num);
    public class EventTest
    {
        private int value;
        public event NumManipulationHandler ChangeNum; 

        public EventTest(int value)
        {
            this.value = value;
        }     

        public void ChangeValue(int num)
        {
            if(this.ChangeNum!=null && num!=this.value)
            {
                this.value = num;

                this.ChangeNum(num);
            }
        }
    }

Program.cs

class Program
{
      static void Main(string[] args)
      {
            EventTest test = new EventTest(1);

            test.ChangeNum += Test_ChangeNum;

            test.ChangeValue(2);
      }

      private static void Test_ChangeNum(int num)
      {
            Console.WriteLine("当前值="+num);
      }
}
奖励园豆:5
E行者 | 小虾三级 |园豆:1761 | 2020-10-01 12:52

多谢

herry507 | 园豆:243 (菜鸟二级) | 2020-10-04 14:26
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册