【问题标题】:Tidying up if statements整理 if 语句
【发布时间】:2026-02-08 05:45:01
【问题描述】:

我做了一个小程序,用数学进行物理计算。

我有几个 if 语句,它们做同样的事情,但对不同的变量,但它必须是它们,好像 TextBox 是空的,int 将是 0

示例如下:

if (firstForceTextBox.Text == "")
{
    firstForceInt = 0;
}
else
{
    firstForceInt = Convert.ToInt16(firstForceTextBox.Text);
}

if (secondForceTextBox.Text == "")
{
    secondForceInt = 0;
}
else
{
    secondForceInt = Convert.ToInt16(secondForceTextBox.Text);
}

我想确保firstForceTextBox.Text == ""secondForceTextBox.Text == "" 都做同样的工作,但要确保一个人不会干预另一个人。

【问题讨论】:

  • 您可以默认firstForceIntsecondForceInt 在开始时为零,并在检查文本框值时使用int.TryParse
  • 你想完成什么?我看到了一些可以缩短代码的不同方法,但是你现在所拥有的并没有错误
  • 您担心什么干预?他们不使用任何相同的变量。它可能很容易更短代码,但我不明白你的问题。
  • 我正在尝试缩短和整理代码,如果一个文本框是空的,那么特定的文本框 int 设置为 0,而其他的就是它们。
  • 正如@NoLifeKing 提到的,我希望默认这些变量的值,所以计算时不会出错。

标签: c# if-statement operators


【解决方案1】:

澄清我在这里做什么。

首先我为声明的两个int 设置一个默认值。

然后我使用int.TryParse 来确保如果您将“香蕉”放入文本框中,代码不会中断。 如果失败,它将只包含 0,就像它应该的那样。

int firstForceInt = 0, secondForceInt = 0;
if(!int.TryParse(firstForceTextBox.Text, out firstForceInt))
{
    // Report error to GUI
}
if(!int.TryParse(secondForceTextBox.Text, out secondForceInt))
{
    // Report error to GUI
}

【讨论】:

  • 值得注意的是,这会改变行为,使得不代表有效整数的值静默评估为零,而 OP 的代码会抛出异常。但是,如果这是所需的行为,那么您的答案是最好的。此外,由于out 参数是明确分配的,因此变量初始化器是多余的。
  • 没有说我们应该报告任何错误,但既然是物理,我应该想到这一点。我会进行编辑。
  • @NoLifeKing 我没有阅读问题中的每一个细节——我的评论更多的是从良好实践的角度来看。在您编辑后,我删除了我之前的评论。
  • 是的,这也很有效...我希望我能投票,但我仍然太低:D
【解决方案2】:

这个怎么样:

firstForceInt = string.IsNullOrEmpty(firstForceTextBox.Text) ? 0 : Convert.ToInt16(firstForceTextBox.Text);
secondForceInt = string.IsNullOrEmpty(secondForceTextBox.Text) ? 0 : Convert.ToInt16(secondForceTextBox.Text);

【讨论】:

  • 这非常有效!非常感谢你! (打算选择这个作为答案)
【解决方案3】:

我会应用一种称为提取方法的重构技术来获得类似的东西

private UInt16 GetInt16(TextBox textBox)
{
    if (textBox.Text == "")
    {
        return 0;
    }
    else
    {
        return Convert.ToInt16(textBox.Text);
    }

private void Later() 
{
    firstForceInt = GetInt16(firstForceTextBox);
    secondForceInt = GetInt16(secondForceTextBox);
}

【讨论】:

    【解决方案4】:

    您可以从这里获取我的功能: Elegant TryParse

    并扩展它:

    public class Extensions
    {
    public static int? TryParse(string this Source)
    {
    if(string.IsNullOrEmpty(Source)) return null;
    if(int.tryparse .... 
    }
    
    }
    

    以后可以写

    firstForceInt = firstForceTextBox.Text.TryParse() ?? 0;
    

    【讨论】:

    • 一般来说,我不建议编写这类扩展方法,但如果你要编写它们,我至少建议在方法名称中包含结果类型。这阐明了该方法的用途,例如,它解析整数而不是俳句,所以称之为TryParseInt32。如果您将来为其他类型添加类似的方法,例如TryParseDouble,此方案还可以提供更高的一致性。