C# 在c中使用事件关键字#

C# 在c中使用事件关键字#,c#,events,delegates,C#,Events,Delegates,我想知道事件在c#中的确切用法是什么。我仍在学习c#的过程中,因此我可能遗漏了一些东西,但是否可以只使用委托。 在本例中,我编写了一个类,其方法的计数范围为0到2^64,每次达到1000的倍数时,都会引发一个事件。代码如下: namespace EventDelegate { class Program { static void Main(string[] args) { EventRaiserClass _eventraiser = new EventRais

我想知道事件在c#中的确切用法是什么。我仍在学习c#的过程中,因此我可能遗漏了一些东西,但是否可以只使用委托。
在本例中,我编写了一个类,其方法的计数范围为0到2^64,每次达到1000的倍数时,都会引发一个事件。代码如下:

namespace EventDelegate
{
class Program
{
    static void Main(string[] args)
    {
        EventRaiserClass _eventraiser = new EventRaiserClass();
        _eventraiser.handler = SomeEventHandler;
        _eventraiser.handler += AnotherEventHandler;
        _eventraiser.Loop();
        Console.Read();
    }

    static void SomeEventHandler(object sender, EventArgs args)
    {
        Console.WriteLine("Event raised");
    }

    static void AnotherEventHandler(object sendr, EventArgs args)
    {
        Console.WriteLine("Event raised (Another handler)");
    }
}

public delegate void Handler(object sender, EventArgs args);

class EventRaiserClass
{
    public Handler handler;
    public void Loop()
    {
        for (long i = 0; i < Int64.MaxValue; i++)
        {
            if ((i % 1000) == 0)
            {
                EventArgs args = new EventArgs();
                RaiseEvent(args);
                System.Threading.Thread.Sleep(1000);
            }
        }
    }

    private void RaiseEvent(EventArgs args)
    {
        if (handler != null)
            handler(this, args);
    }
}
命名空间事件委托
{
班级计划
{
静态void Main(字符串[]参数)
{
EventRaiserClass_eventraiser=新的EventRaiserClass();
_eventraiser.handler=SomeEventHandler;
_eventraiser.handler+=另一个eventhandler;
_eventraiser.Loop();
Console.Read();
}
静态void SomeEventHandler(对象发送方、事件args args)
{
Console.WriteLine(“引发的事件”);
}
静态void anotherenthandler(对象sendr、事件args args)
{
WriteLine(“引发的事件(另一个处理程序)”);
}
}
公共委托无效处理程序(对象发送方、事件args args);
类EventRaiserClass
{
公共经办人;
公共void循环()
{
用于(长i=0;i
}

如果我将
处理程序
委托变量声明为这样的事件
公共事件处理程序


抱歉,如果我有点含糊或遗漏了一些明显的内容,但我只是想知道在使用
事件时,幕后是否发生了其他事情,而不仅仅是使用委托,或者只是为了可读性。事件和委托是相似的,但出于充分的理由,事件受到了更多的限制

在代码中,您可以从外部使用
\u eventraiser.handler
执行各种操作。不过,这些事情大部分你都不应该做

以这一行为例:

_eventraiser.handler = SomeEventHandler;
如果使用委托,则每次尝试附加事件处理程序时都必须检查委托是否为
null
,然后使用
=
对其进行初始化,如果不是null,则只需添加具有
+=
的处理程序。如果您忘记了初始化,您将得到一个空引用异常,如果您输入的异常太多,您将覆盖前面的所有内容

如果在本例中使用事件而不是委托,则不必执行任何操作,事实上,您甚至无法执行这些操作。对于委托,您甚至可以将其传递给其他一些类,这可能非常危险

这同样适用于
调用
,以及您可以对委托执行的所有其他操作:它们不用于事件。对于来自外部类的事件,您只能执行
+=
-=
,仅此而已。您可以通过一个带有复杂getter和setter的特殊公共接口将它们视为委托


(事件还有一个特殊的
add
remove
语法,但这是一个非常少见的功能)

可能与See重复谢谢,我会看一看。@JonSkeet请写更多的文章。。请如果我(作为类的用户)执行以下操作会发生什么:
\u eventraiser.handler=null?谢谢你的帮助。我返回到代码并使委托成为一个事件,之后我在这一行上得到一个错误
\u eventraiser.handler=SomeEventHandler将尝试覆盖以前订阅的所有方法。:-)