c# - 在事件处理 C# 中创建事件变量需要什么?

标签 c# events event-handling

我阅读了有关如何制作事件处理程序的内容,我发现所有教程和文章都用于制作委托(delegate)和事件变量。我不明白他们为什么要使用事件变量,因为我们可以只使用委托(delegate)来制作事件处理程序,就像这样的代码:

namespace EventsTest
{     
    public class Counter
    {
        public delegate void ReachedEventHandler(object sender);
        public ReachedEventHandler fireEvent;
        // public event ReachedEventHandler fireevent;
        private int counter = 0;

        public void Add(int x, int toReach)
        {
            counter += x;
            if (counter == toReach && fireEvent != null)
               fireEvent(this);
        }
    }

    public class Test
    {
        public static void Main()
        {
            Counter x = new Counter();
            x.fireEvent += new Counter.ReachedEventHandler(CounterReachedEventHandler);
            x.Add(1, 1);
        }

        private static void CounterReachedEventHandler(object sender)
        {
            Console.WriteLine("Reached!");
        }
    }
}

这样就可以了,那么制作事件变量有什么必要呢?

谢谢!

最佳答案

event关键字保证封装:您将无法调用或修改 fireEventCounter之外.外部唯一可用的操作是订阅和取消订阅( +=-= )。

关于您的代码的几点说明:

  1. 一般来说,你应该使用EventHandler委托(delegate)而不是定义你自己的等价物( ReachedEventHandler )和 EventHandler<TEventArgs>如果是定制 EventArgs .

  2. 你的 ReachedEventHandler不遵循事件的标准约定。他们应该有两个参数( object senderTEventArgs args ,其中 TEventArgsEventArgs 或子类)并返回 void .

  3. 显式 new Counter.ReachedEventHandler()调用也是不必要的。

关于c# - 在事件处理 C# 中创建事件变量需要什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21497295/

相关文章:

mysql - FullCalendar jquery json 事件 MySQL 问题

一个元素的 jQuery onfocus 有另一个元素可点击

javascript - 等待 document.body 存在

javascript - onmousedown 覆盖 onmouseup 和 onclick

c# - 依赖注入(inject)组合根和装饰器模式

c# - 暂停窗口,如 MessageBox.Show()

c# - EFCore 不识别数据库提供程序

c# - this == null 怎么可能?

c# - ASP.net 登录控件成员提供程序

c# - 检查鼠标左键按下的时间