C#事件,那个null的东西是什么?
我无法真正理解在提升事件时这个空测试的东西是什么。
说我有这个代码。
class ballClass { public event EventHandler BallInPlay; public void onHit() { if (BallInPlay != null) { BallInPlay(this, new EventArgs()); } else { MessageBox.Show("null!"); } } }
而且我想在触发onHit()方法时引发BallInPlay。
现在它告诉我BallInPlay是null。 我应该怎样或者用什么“填充”它才能起作用?
谢谢!
您需要使用处理程序订阅该事件。 例如:
BallClass ball = new BallClass(); ball.BallInPlay += BallInPlayHandler; // Now when ball.OnHit is called for whatever reason, BallInPlayHandler // will get called ... private void BallInPlayHandler(Object sender, EventArgs e) { // React to the event here }
有关更多信息,您可能需要阅读有关事件和委托的文章 。
请注意,我已经修复了上面的BallClass
和OnHit
– 最好使用标准的.NET命名约定来使代码更好地适应它周围的代码,并使其对其他人更具可读性。
有一点需要注意:您目前所获得的无效检查不是线程安全的。 最后一个订阅者可以在 if
但在调用之前取消订阅。 线程安全的版本是:
public void OnHit() { EventHandler handler = BallInPlay; if (handler != null) { handler(this, new EventArgs()); } else { MessageBox.Show("null!"); } }
这不能保证使用最新的订阅者(因为没有涉及内存障碍),但保证不会因竞争条件而抛出NullReferenceException。
这里的事情是,如果注册零监听器来监听此事件被引发,则该事件为空。 如果一个或多个听众被注册,它将具有一个值。
这意味着如果注册了零侦听器,并且您尝试在不执行空检查的情况下引发事件,则程序将抛出异常。
null测试是因为如果NOONE正在侦听事件,那么你swuold调用的事件对象实际上是null。 因此,没有订阅者,您将获得空指针exception。
如果没有为事件分配事件处理程序,则事件为null。 将事件视为List,当列表中没有项目时,事件的值变为null
。
在没有为其分配事件处理程序时尝试调用事件将引发NullReferenceException。
空检查可防止NullReferenceException。
如果你想让BallInPlay工作,你需要添加一个EventHandler
。
你的代码将是这样的:
BallInPlay += new EventHandler(YourFunctionNameGoesHere);
空测试用于确定是否有任何内容正在侦听事件。 一旦某事附加了事件处理程序,BallInPlay将不再为null
BallInPlay(this, new EventArgs());
一旦您意识到上面的代码行实际编译好,就好像您已经编写了以下代码,那么在触发事件之前进行null
检查的原因就会变得很明显:
BallInPlay.Invoke(this, new EventArgs()); // ^^^^^^^
众所周知,在null
引用上调用方法是个坏主意。 这就是为什么你需要首先检查BallInPlay != null
。
其他建议:
上述就是C#学习教程:C#事件,那个null的东西是什么?分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!
protected virtual void OnHit() { EventHandler handler = BallInPlay; // use a local copy of the event if (handler != null) // for better thread-safety! { handler(this, EventArgs.Empty); } }
BallInPlay += new EventHandler(myFunc); public void myFunc(object sender, EventArgs e) { MessageBox.Show("Woho o/"); }
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/cdevelopment/1023329.html