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 });
}
我正在为一个大学项目创建一个 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 });
}