c# 空引用导致自定义 EventArgs 出现问题

c# Null reference causing trouble for custom EventArgs

我正在为一个大学项目创建一个 EPoS 系统,但是我 运行 遇到了一段关于事件参数的复杂代码。

这些代码片段位于处理交易结束的付款表单上。我已将 PaymentMadeEvent 声明为:

    public delegate void PaymentMadeEvent(object sender, paymentMadeEventArgs e);

    public event PaymentMadeEvent PaymentForm_PaymentMade;

接下来,我在代码页底部的单独 public class 中声明了一个布尔值,如下所示:

public class paymentMadeEventArgs: EventArgs
{
    private bool paymentSuccess = true;

    public bool PaymentSuccess
    {
        get { return paymentSuccess; }
        set { paymentSuccess = value; }
    }
}

接下来我复制了一段在输入时处理付款的示例代码:

private void PaymentHasBeenMade(object sender, EventArgs e)
    {

        try
        {
            total = decimal.Parse(txtBoxAmountToPay.Text) - decimal.Parse(txtBoxAmountTendered.Text);
        }
        catch
        {
            MessageBox.Show("An Error has occured, please enter a valid amount.");
            return;
        }

        if(total >0)
        {
            txtBoxAmountToPay.Text = String.Format("{0:c}", total);
        }
        else
        {
            MessageBox.Show("Please give " + String.Format("{0:c}", -total) + " in change.");
            PaymentForm_PaymentMade(this, new paymentMadeEventArgs(){ PaymentSuccess = true });
        }
    }

错误是

System.NullReferenceException

这似乎来自这里的这一行:

PaymentForm_PaymentMade(this, new paymentMadeEventArgs(){ PaymentSuccess = true });

谁能看出我做错了什么?

提前致谢。

活动在有订阅者之前为空,因此您需要

if(PaymentForm_PaymentMade != null)
    PaymentForm_PaymentMade(this,new paymentMadeEventArgs(){ PaymentSuccess = true })

这是特定代码模式的起源,它以不在事件名称中重复您的表单名称开始:

public event PaymentMadeEvent PaymentMade;

并且有一个 On<EventName> 方法,通常受到保护。

protected void OnPaymentMade(PaymentMadeEventArgs e)
{
    if(this.PaymentMade != null)
         this.PaymentMade(this,e);
}

那么你就不必用 if(...)

弄脏你的代码了
if(total >0)
{
    txtBoxAmountToPay.Text = String.Format("{0:c}", total);
}
else
{
    MessageBox.Show("Please give " + String.Format("{0:c}", -total) + " in change.");
    OnPaymentMade(new PaymentMadeEventArgs(){ PaymentSuccess = true });
}