我在这里遇到了一个问题,
在您写“ duplicate”之前,我要说我做得很好,而我在编程方面并不擅长,这就是为什么我要问这个问题。
问题是我的活动没有触发
调试器说:=>“ OnCollision为空”
编辑:调试部分
OnCollision是我的活动
感谢帮助:D
那是我的EventArgs
public class CollisionEventArgs : EventArgs
{
public bool Hit { get { return hit; } }
private bool hit;
public CollisionEventArgs(bool _hit)
{
this.hit = _hit;
}
}
HitControl
public delegate void CollisionHandler(object current, CollisionEventArgs cea);
public class HitControl : Button
{
public event CollisionHandler OnCollision;
public bool IsHit
{
get { return isHit; }
set
{
if (OnCollision != null)
{
if (this.Width > 100)
OnCollision(this, new CollisionEventArgs(true));
}
}
}
public bool isHit;
public HitControl()
{ }
}
方法
private void hitControl1_OnCollision_1(object current, CollisionEventArgs cea)
{
MessageBox.Show("a");
}
设计器[Sub]中的代码
//
// hitControl1
//
this.hitControl1.IsHit = false;
this.hitControl1.Location = new System.Drawing.Point(115, 183);
this.hitControl1.Name = "hitControl1";
this.hitControl1.Size = new System.Drawing.Size(175, 23);
this.hitControl1.TabIndex = 1;
this.hitControl1.Text = "hitControl1";
this.hitControl1.UseVisualStyleBackColor = true;
this.hitControl1.OnCollision += new CollisionHandler(this.hitControl1_OnCollision_1);
答案 0 :(得分:1)
问题是在事件被连接之前,在 之前设置了IsHit
属性。为了安全地触发事件,请使用以下语法,而不是直接调用:
OnCollision?.Invoke(this, new CollisionEventArgs(true));
?.
(所谓的猫王)运算符首先检查OnCollision
是否不是null
,然后仅在这种情况下调用Invoke
方法,该方法实际上执行事件。直接使用OnCollision(sender, new CollisionEventArgs(true))
不起作用,因为在没有事件订阅者的情况下,OnCollision
为null
,并且抛出NullReferenceException
。
如果使用的C#早期版本不支持?.
运算符,则可以执行以下操作:
var handler = OnCollision;
if ( handler != null )
{
handler(this, new CollisionEventArgs(true));
}
如我所展示的,将当前实例存储在单独的变量中比直接使用OnCollision
更为安全,因为这可能会在多线程环境中引起问题。有关更多信息,请参见this答案。幸运的是,?.
不会发生这种情况,因为它已经以线程安全的方式构建,并且本质上在后台执行了相同的操作。