我是C#的新手,但不是一般的编程。 我正在尝试为我的程序添加一些错误检查。有3个文本框,我试图这样做,如果文本框留空,它假定值为0.这是我的代码到目前为止:
private void btnCalculate_Click(object sender, EventArgs e)
{
if (String.IsNullOrEmpty(txtNumberOfClassATix.Text)) // Assumes 0 if no number entered for txtNumberOfClassATix.Text.
{
txtNumberOfClassATix.Text = "0";
}
if (String.IsNullOrEmpty(txtNumberOfClassBTix.Text)) // Assumes 0 if no number entered for txtNumberOfClassBTix.Text.
{
txtNumberOfClassBTix.Text = "0";
}
if (String.IsNullOrEmpty(txtNumberOfClassCTix.Text)) // Assumes 0 if no number entered for txtNumberOfClassCTix.Text.
{
txtNumberOfClassCTix.Text = "0";
}
int classANum = int.Parse(txtNumberOfClassATix.Text);
int classBNum = int.Parse(txtNumberOfClassBTix.Text);
int classCNum = int.Parse(txtNumberOfClassCTix.Text);
double classATotal = classANum * classAPrice;
double classBTotal = classBNum * classBPrice;
double classCTotal = classCNum * classCPrice;
lblCalculatedClassARevenue.Text = $"{classATotal:c}";
lblCalculatedClassBRevenue.Text = $"{classBTotal:c}";
lblCalculatedClassCRevenue.Text = $"{classCTotal:c}";
lblCalculatedTotalRevenue.Text = $"{(classATotal + classBTotal) + classCTotal:c}";
}
这段代码有效,但我确信我可以用更简单的东西替换那些if语句。我已经看过如果使用空条件运算符将另一个变量置零,如何将变量设置为null,但我并没有真正掌握它以使其适应我的场景。
答案 0 :(得分:3)
到目前为止,maccettura的答案是最好的,但我们可以做得更好吗?我们当然可以。让我们制作一个通用的扩展方法:
internal static class Extensions
{
public static int? AsInt(this string s)
{
int result;
if (s == null)
return null;
else if (int.TryParse(s, out result))
return result;
else
return null;
}
}
现在:
int classANum = txtNumberOfClassATix.Text.AsInt() ?? 0;
如果它是一个int,你得到int。如果不是,你会得到零。容易腻。
或者,您可能需要此扩展方法:
internal static class Extensions
{
public static int AsInt(this string s, int default = 0)
{
int result;
if (s == null)
return default;
else if (int.TryParse(s, out result))
return result;
else
return default;
}
}
现在,您可以在不使用??
的情况下说明默认设置。
这种编程风格称为“流畅编程”;它可以使代码易于阅读和理解。
请注意,此解决方案不使用零更新UI;如果你想这样做那么我建议将它分成两个步骤:一个导致突变,然后是一个计算值的单独步骤。对其效果及其价值都有用的操作可能令人困惑。
答案 1 :(得分:1)
这是使用方法的最佳时机,因此您不必重复自己:
private static int GetInputAsInt(TextBox textbox)
{
int outputValue = 0;
if(textbox?.Text != null && int.TryParse(textbox.Text, out outputValue))
{
return outputValue;
}
return 0;
}
现在您正在检查文本框本身是否为空,并且其中包含的值是int,如果有任何失败则返回0;
用你喜欢的其他方法调用它:
int classANum = GetInputAsInt(txtNumberOfClassATix);
这意味着您的按钮点击事件会更简单一些:
private void btnCalculate_Click(object sender, EventArgs e)
{
int classANum = GetInputAsInt(txtNumberOfClassATix);
int classBNum = GetInputAsInt(txtNumberOfClassBTix);
int classCNum = GetInputAsInt(txtNumberOfClassCTix);
double classATotal = classANum * classAPrice;
double classBTotal = classBNum * classBPrice;
double classCTotal = classCNum * classCPrice;
lblCalculatedClassARevenue.Text = $"{classATotal:c}";
lblCalculatedClassBRevenue.Text = $"{classBTotal:c}";
lblCalculatedClassCRevenue.Text = $"{classCTotal:c}";
lblCalculatedTotalRevenue.Text = $"{(classATotal + classBTotal) + classCTotal:c}";
}
答案 2 :(得分:0)
为了简单起见,一个好的方法是使用条件运算符。完整的示例如下(为了便于阅读,分为两行):
txtNumberOfClassATix.Text =
String.IsNullOrEmpty(txtNumberOfClassATix.Text) ? "0" : txtNumberOfClassATix.Text;
对于第一部分,这是一个很好的,可读的分配:
myString = ...
条件运算符通过在true
的左侧提供布尔表达式(false
/ ?
)来分解。所以,例如:
myString = anotherString == "" ? ... // checking if another string is empty
最后一部分是:
。如果表达式为true
,则左侧为赋值;如果表达式为false
,则右侧为赋值。完成示例:
myString = anotherString == "" ? "anotherString is empty" : "anotherString is not empty";
上面的例子可以全文写出,以消除任何误解:
if (anotherString == "")
{
myString = "anotherString is empty";
}
else
{
myString = "anotherString is not empty";
}
这适用于所有陈述。 documentation is found here。
答案 3 :(得分:0)
减少代码行的最佳方法是使用该功能进行常规操作。在您的情况下,您可以创建检查对象是否为空或空的函数。根据该函数的返回值,您可以继续。另一方面,您可以使用不同的验证器(如RequiredFieldValidator,CustomValidator等)在前端处理它。