【问题标题】:More efficient abridged use of IF statement C#IF 语句 C# 更有效的节略使用
【发布时间】:2015-03-06 13:15:28
【问题描述】:

我想知道是否有更好更有效的方式来使用 if 语句,而不仅仅是长行

if(){
    //code
}else if(){
    //code
} else{
    //code
}

我在网站上做了一些研究,发现了这个:

如果您只有 2 个值,我强烈建议您使用您发布的代码,因为它可能是最易读、最优雅和最快速的代码(恕我直言)。

但是如果你有更多这样的案例并且更复杂,你可以 考虑使用 switch 语句:

switch (el.type)
{
    case ElementType.Type1:
    case ElementType.Type2:
    case ElementType.Type3:
        //code here
        break;
    case ElementType.Type4:
    case ElementType.Type5:
        //code here
        break;
    case ElementType.Type6:
        //code here
        break;
}
that translated in if statements would be:

if (el.type == ElementType.Type1 ||
    el.type == ElementType.Type2 ||
    el.type == ElementType.Type3 )
{
    // code here
}else if(el.type == ElementType.Type4 ||
         el.type == ElementType.Type5)
{
    // code here
}else if(el.type == ElementType.Type6)
{
    // code here
}

他们和我完全一样,但开关看起来更可读/更清晰,你需要输入更少(即它在代码长度方面“更短”):)

虽然我不太明白它在告诉我什么,但它是说 switch 语句更适合长 if 语句还是?

为了了解我的问题的一些上下文,我有一个带有一些单选按钮的 Windows 窗体应用程序 - 如果你愿意,可以填写一份问卷 - 我想知道是否有更有效的方法可以减少重复的不必要的代码行并将它们替换为简短的做同样工作的代码。

【问题讨论】:

  • ifswitch 都是流控制语句。在大多数情况下,它们在技术上是可互换的(80% 的时间)。选择最符合上下文的一项。
  • 你能发布你的 if/else 代码的(短)部分吗?
  • 这可以通过多态行为解决吗?您如何为ElementType 创建或分配不同的值?
  • 我们真的需要更多的上下文。你说你有一些单选按钮。您如何在 if/else 级联中访问它们?你能发布一些示例代码吗?

标签: c# design-patterns refactoring


【解决方案1】:

目标应该是更可读/更清晰的代码,这并不总是意味着最短的语句。

如果您有非常复杂的逻辑,有很多嵌套的 if / else 分支,请尝试将其拆分为更小、更简单的例程。

【讨论】:

    【解决方案2】:

    Switch 语句以及许多if-else 语句通常是臭味设计的标志。 考虑重构为more object-oriented design

    If-else 的可读性并不比 switch-case 高多少,反之亦然。

    【讨论】:

    • 非常有趣,我一定会在不久的将来将其作为学习点。非常感谢您将信息链接到我,文章清晰且相关,我会奖励您的答案,虽然这不是我现在想要的答案,但它会在未来帮助我更多。
    【解决方案3】:

    您可以申请CoR patternHere 你会很好的 .NET 实现之一。 当您将其与IoC container 结合使用时,您可能会获得非常灵活的架构...

    【讨论】:

      【解决方案4】:

      switch 语句不仅更易于阅读,而且更易于编译器优化,因为它们明确指定了一个值,您将触发所有代码。编译器可以使用散列或跳转表而不是一系列比较轻松地优化它,使其更快(当它可以这样做时)。从技术上讲,它可以检测到if 语句是同一件事,但可能足够复杂,也可能不够复杂。因此,如果您有 256 个单独的案例触发 byte 的值,则可以将开关编译为代码偏移量的硬编码数组(数组中的每个条目都是处理该案例的代码的偏移量),并且没有完全进行比较是因为它可以只使用字节值作为硬编码数组的索引并跳转到正确的代码。这比进行 255(或 256)次比较快很多

      使用string 值的开关也经过特殊处理,使用哈希码以获得更好的性能。你也许可以明确地做类似的事情,但你的代码可读性会差很多。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-11-27
        • 1970-01-01
        • 1970-01-01
        • 2021-11-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-02-14
        相关资源
        最近更新 更多