C#IF语句,并且非常具体地根据它做事情,这是正确的

C#IF语句,并且非常具体地根据它做事情,这是正确的,c#,if-statement,minify,C#,If Statement,Minify,首先,我看到过这样的帖子: 这并不是我所需要的,尽管这个想法是相关的,因为我希望它是更可读的代码 我认为切换是最好的选择,但让我解释一下 我有以下声明: if (input == string.Empty || typeComboBox.Text == null) { MessageBox.Show("Nothing to encrypt!", "Nothing Selected!"); return null; } 所以这里的想法是,我曾经把这个语句分

首先,我看到过这样的帖子:

这并不是我所需要的,尽管这个想法是相关的,因为我希望它是更可读的代码

我认为切换是最好的选择,但让我解释一下

我有以下声明:

if (input == string.Empty || typeComboBox.Text == null)
{
    MessageBox.Show("Nothing to encrypt!", "Nothing Selected!");            
    return null;
}
所以这里的想法是,我曾经把这个语句分成两个“IF”语句,这不是什么大问题,但为了可读性,以及我不断减少代码的努力,我想把这些语句合并成一个

如果输入为空,我希望出现MessageBox.Show中的第一个参数,但不显示第二个参数

如果typeComboBox.Text为null,我希望显示第二个选项,但不显示第一个选项

如果它们都是真的,我希望它们都出现

现在,我的目标是在不使用多个测试或方法的情况下完成这两项工作。基本上,我的意思是:如果我能找到哪个条件是真的,并在同一个语句中输出结果数据,那将是理想的

我认为开关是一种选择,我还不太了解它们,但我认为这需要我根据测试结果制定决策方法,并将结果发送给开关;这并不理想,因为我可以只使用两个if语句和更少的代码

有没有办法在一份声明中做到这一点?这对于这个特定的项目来说是没有必要的,但我想知道未来的情况


谢谢

我假设您是从以下代码开始的:

if (input == string.Empty)
{
    MessageBox.Show("Nothing to encrypt!");            
    return null;
}

if (typeComboBox.Text == null)
{
    MessageBox.Show("Nothing Selected!");            
    return null;
}
我不认为这个代码有任何错误,这可能是最可读的。它将根据需要执行尽可能多的测试,不再需要更多。任何替代方案都会导致执行更多的测试,即使您可能会得到更少的代码。例如:

if (input == string.Empty || typeComboBox.Text == null)
{
    MessageBox.Show((input == string.Empty) ? "Nothing to encrypt!" : "Nothing Selected!");
    return null;
}
代码行数减少,但在故障场景中,将执行两到三个测试,而不是一到两个。这也有点不那么直截了当

简洁的代码很好,但是如果代码过于简洁,那么维护起来就会变得更加困难。可读性介于详细和简洁之间,在我看来,在这种情况下,更详细的代码更具可读性


另一个选择是考虑一个事实,即报告多个错误是合适的。为此,请尝试以下代码:

List<string> errors = new List<string>();

if (input == string.Empty)
{
    errors.Add("Nothing to encrypt.");
}

if (typeComboBox.Text == null)
{
    errors.Add("Nothing selected.");
}

if (errors.Count != 0)
{
    MessageBox.Show(string.Join(" ", errors.ToArray()));
    return null;
}
var errors = validationRules.Where(r => !r.Test()).Select(r => r.ErrorMessage);
if (errors.Any())
{
    MessageBox.Show(string.Join(' ', errors));            
    return null;
}
List errors=newlist();
if(输入==string.Empty)
{
错误。添加(“无需加密”);
}
if(typeComboBox.Text==null)
{
错误。添加(“未选择任何内容”);
}
如果(errors.Count!=0)
{
Show(string.Join(“,errors.ToArray());
返回null;
}

这比您的原始代码要详细一点,但它将允许报告所有相关错误,而不是仅报告遇到的第一个错误。

我假设您是从以下代码开始的:

if (input == string.Empty)
{
    MessageBox.Show("Nothing to encrypt!");            
    return null;
}

if (typeComboBox.Text == null)
{
    MessageBox.Show("Nothing Selected!");            
    return null;
}
我不认为这个代码有任何错误,这可能是最可读的。它将根据需要执行尽可能多的测试,不再需要更多。任何替代方案都会导致执行更多的测试,即使您可能会得到更少的代码。例如:

if (input == string.Empty || typeComboBox.Text == null)
{
    MessageBox.Show((input == string.Empty) ? "Nothing to encrypt!" : "Nothing Selected!");
    return null;
}
代码行数减少,但在故障场景中,将执行两到三个测试,而不是一到两个。这也有点不那么直截了当

简洁的代码很好,但是如果代码过于简洁,那么维护起来就会变得更加困难。可读性介于详细和简洁之间,在我看来,在这种情况下,更详细的代码更具可读性


另一个选择是考虑一个事实,即报告多个错误是合适的。为此,请尝试以下代码:

List<string> errors = new List<string>();

if (input == string.Empty)
{
    errors.Add("Nothing to encrypt.");
}

if (typeComboBox.Text == null)
{
    errors.Add("Nothing selected.");
}

if (errors.Count != 0)
{
    MessageBox.Show(string.Join(" ", errors.ToArray()));
    return null;
}
var errors = validationRules.Where(r => !r.Test()).Select(r => r.ErrorMessage);
if (errors.Any())
{
    MessageBox.Show(string.Join(' ', errors));            
    return null;
}
List errors=newlist();
if(输入==string.Empty)
{
错误。添加(“无需加密”);
}
if(typeComboBox.Text==null)
{
错误。添加(“未选择任何内容”);
}
如果(errors.Count!=0)
{
Show(string.Join(“,errors.ToArray());
返回null;
}

这比您的原始代码要详细一点,但它将允许报告所有相关错误,而不是只报告遇到的第一个错误。

我建议使用一种稍微不同的模式,可能更具可读性:

StringBuilder message = new StringBuilder();

if (input == string.Empty) message.Append("Nothing to encrypt!\n");
if (typeComboBox.Text == null) message.Append("Nothing selected!\n");
// ... repeat as many times as desired ...

if (message.Length > 0) {
    MessageBox.Show(message);
    return null;
} else {
    // proceed with your code here
}

此代码的优点是,如果多条消息有效,它可以显示多条消息。如果用户一次只能看到一条消息,这可能会让他们感到沮丧,因为他们必须返回,修复某些内容,点击提交,然后看到不同的错误消息。

我建议使用一种稍微不同的模式,可能更具可读性:

StringBuilder message = new StringBuilder();

if (input == string.Empty) message.Append("Nothing to encrypt!\n");
if (typeComboBox.Text == null) message.Append("Nothing selected!\n");
// ... repeat as many times as desired ...

if (message.Length > 0) {
    MessageBox.Show(message);
    return null;
} else {
    // proceed with your code here
}
此代码的优点是,如果多条消息有效,它可以显示多条消息。如果用户一次只能看到一条消息,这可能会让他们感到沮丧,因为他们必须返回,修复某些东西,点击提交,然后看到不同的错误消息。

我不会说这比几个“如果”语句好,但这只是一条

var message = 
    ((input==string.Empty ? 
        "Nothing to encrypt! " : 
        "") +
    (typeComboBox.Text == null ?
        "Nothing Selected!" :
        "")).Trim();


if (message != "") {
    MessageBox.Show(message);
    return null;
}
一般来说,虽然我喜欢使用条件运算符来构造逻辑树,从而产生单一结果,但它比一堆嵌套的
if/else
子句要简洁得多。只要你适当缩进,我觉得这样的结构可读性和表达能力都很强。不幸的是,在这种情况下,这并不理想,因为结果取决于操作数的组合。使用这种逻辑来构建字符串可能不是最好的主意,尽管它可能仍然是最简洁的选项。

我不会说这比几个“if”语句好,但它只是一个

var message = 
    ((input==string.Empty ? 
        "Nothing to encrypt! " : 
        "") +
    (typeComboBox.Text == null ?
        "Nothing Selected!" :
        "")).Trim();


if (message != "") {
    MessageBox.Show(message);
    return null;
}
一般来说,虽然我喜欢使用条件运算符来构造逻辑树,从而产生单一结果,但它比一堆嵌套的
if/else
子句要简洁得多。只要你适当缩进,我觉得这样的结构可读性和表达能力都很强。不幸的是,在这种情况下,这并不理想,因为结果取决于操作数的组合。使用这种逻辑来构建字符串可能不是最好的主意,尽管它可能仍然是最简洁的选项。

这里