C#自定义事件为NULL

时间:2018-10-01 12:19:45

标签: c# winforms events

我在这里遇到了一个问题,

在您写“ duplicate”之前,我要说我做得很好,而我在编程方面并不擅长,这就是为什么我要问这个问题。

问题是我的活动没有触发

调试器说:=>“ OnCollision为空”

编辑:调试部分

enter image description here

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);

1 个答案:

答案 0 :(得分:1)

问题是在事件被连接之前,在 之前设置了IsHit属性。为了安全地触发事件,请使用以下语法,而不是直接调用:

OnCollision?.Invoke(this, new CollisionEventArgs(true));

?.(所谓的猫王)运算符首先检查OnCollision是否不是null,然后仅在这种情况下调用Invoke方法,该方法实际上执行事件。直接使用OnCollision(sender, new CollisionEventArgs(true))不起作用,因为在没有事件订阅者的情况下,OnCollisionnull,并且抛出NullReferenceException

如果使用的C#早期版本不支持?.运算符,则可以执行以下操作:

var handler = OnCollision;
if ( handler != null )
{
   handler(this, new CollisionEventArgs(true));
}

如我所展示的,将当前实例存储在单独的变量中比直接使用OnCollision更为安全,因为这可能会在多线程环境中引起问题。有关更多信息,请参见this答案。幸运的是,?.不会发生这种情况,因为它已经以线程安全的方式构建,并且本质上在后台执行了相同的操作。