繁体   English   中英

如果为空,则使用空条件运算符将值设置为0

[英]Use null-conditional operator to set value to 0 if null

我是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),但是我对它的适应性还不足以适应我的情况。

到目前为止,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; 如果您想这样做,我建议将其分为两个步骤:一个导致突变,然后一个单独的步骤来计算值。 对于效果和价值都有用的操作可能会造成混淆。

这是使用方法的最佳时机,这样您就不必重复自己了:

private static int GetInputAsInt(TextBox textbox)
{
    int outputValue = 0;
    if(textbox?.Text != null && int.TryParse(textbox.Text, out outputValue))
    {  
        return outputValue;
    }
    return 0;
}

现在,您正在检查文本框本身是否不为null,并且其中包含的值为int,如果失败,则返回0;否则,返回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}";
}

为了简单起见,一个好的方法是使用条件运算符。 下面是完整的示例(为了便于阅读,分为两行):

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";    
}

这可以适用于所有语句。 文档位于此处

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM