C# 在c中使用事件关键字#
我想知道事件在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
在本例中,我编写了一个类,其方法的计数范围为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代码>将尝试覆盖以前订阅的所有方法。:-)