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

C# 如果为null,则使用null条件运算符将值设置为0,c#,null-conditional-operator,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 ente

我对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,但我并没有真正掌握足够的知识来适应我的场景。

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

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

这适用于所有语句。为了保持简单,一个好的方法是使用条件运算符。为了便于阅读,下面的完整示例分为两行:

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

这适用于所有语句。.

这是使用一种方法的最佳时机,这样你就不会重复自己:

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

在其他方法中调用它,如下所示:

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

这是使用一种方法的最佳时机,这样你就不会重复你自己了:

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

在其他方法中调用它,如下所示:

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

到目前为止,麦克塞图拉的答案是最好的,但我们能做得更好吗?当然可以。让我们做一个通用的扩展方法:

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;
  }
}
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;
  }
}
现在:

    int classANum = txtNumberOfClassATix.Text.AsInt() ?? 0;
如果是int,你得到int,如果不是,你得到零。简单的豌豆

或者,您可能需要此扩展方法:

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;
  }
}
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;如果你想这样做,我建议你把它分成两个步骤:一个是导致变异的步骤,另一个是计算值的单独步骤。对其效果和值都有用的操作可能会令人困惑。

到目前为止,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;
  }
}
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;
  }
}
现在:

    int classANum = txtNumberOfClassATix.Text.AsInt() ?? 0;
如果是int,你得到int,如果不是,你得到零。简单的豌豆

或者,您可能需要此扩展方法:

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;
  }
}
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;如果你想这样做,我建议你把它分成两个步骤:一个是导致变异的步骤,另一个是计算值的单独步骤。对其效果和值都有用的操作可能会令人困惑。

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

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

您可以使用TryParse,如果失败则使用0。int classANum=int.TryParsetxtNumberOfCl
阿萨提克斯,文本,1号变量?val1:0;然后您可以删除解析上面的所有代码。空条件运算符仅适用于空值,而不适用于空字符串或空白值。我建议您按照int-parseNumberString文本{return string.IsNullOrEmptytext?0:int.Parsetext;}编写一个函数。考虑如何处理除空字符串以外的无效输入。您可以改用TryParse,如果失败,则使用0。int classANum=int.TryParsetxtNumberOfClassATix.Text,out var val1?val1:0;然后您可以删除解析上面的所有代码。空条件运算符仅适用于空值,而不适用于空字符串或空白值。我建议您按照int-parseNumberString文本{return string.IsNullOrEmptytext?0:int.Parsetext;}编写一个函数。考虑如何处理无效输入,而不是空字符串。