如果为null

时间:2018-01-30 20:50:20

标签: c# null-conditional-operator

我是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,但我并没有真正掌握它以使其适应我的场景。

4 个答案:

答案 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等)在前端处理它。