1

我是 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 条件运算符将一个变量设置为 null 如果另一个变量为 null,但我并没有真正掌握它以使其适应我的场景。

4

4 回答 4

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;如果您想这样做,那么我建议将其分为两个步骤:一个导致突变,然后一个单独的步骤计算值。对其效果和值都有用的操作可能会令人困惑。

于 2018-01-30T21:14:34.003 回答
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}";
}
于 2018-01-30T20:57:10.943 回答
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";    
}

这可以适用于所有语句。文档可在此处找到。

于 2018-01-30T20:55:07.073 回答
0

减少代码行的最佳方法是将函数用于您的常见操作。在您的情况下,您可以创建检查对象是否为 NULL 或空的函数。根据该函数的返回值,您可以继续进行。另一方面,您可以通过使用不同的验证器(如RequiredFieldValidator、CustomValidator 等)在前端处理它。

于 2018-02-01T21:35:54.007 回答