"如果不是' someCondition'别的"逻辑

时间:2015-10-08 13:56:33

标签: vb.net if-statement negation

我有一些同事以我以前从未见过的方式实现if-else逻辑,这让我感到困惑。

他们写......

If <someCondition> Then
Else
    Console.WriteLine("Hello, World")

...而不是

If Not <someCondition> Then
    Console.WriteLine("Hello, World")

这让我想到了

这两种方法有什么区别吗?  一种方法比另一种更有效吗?

4 个答案:

答案 0 :(得分:3)

  1. 问题:&#34;这两种方法有什么区别吗?&#34;

      

    答案:,没有区别。

  2. 问题:&#34;一种方法比另一种更有效吗?&#34;

      

    答案:,它们都同样有效。

  3. 我怎么知道这个?

    嗯,在这种情况下,通过创建测试项目并查看已编译的IL(发布配置),可以轻松确定差异。

    我使用Visual Studio Community 2015和.NET 4.5.2创建了一个控制台应用程序。作为反编译器,我使用了.NET反射器(一种免费的替代方案是ILSpy)。

    <强> VB.NET

    Public Sub Test1(condition As Boolean)
        If (condition) Then
        Else
            Console.WriteLine("condition was false.")
        End If
    End Sub
    
    Public Sub Test2(condition As Boolean)
        If (Not condition) Then
            Console.WriteLine("condition was false.")
        End If
    End Sub
    

    控制台输出:

    condition was false.
    condition was false.
    

    <强> IL

    如前所述,并在下面确认,两种方法都是相同的。

    .method public static void Test1(bool condition) cil managed
    {
        .maxstack 8
        L_0000: ldarg.0 
        L_0001: brtrue.s L_000d
        L_0003: ldstr "condition was false."
        L_0008: call void [mscorlib]System.Console::WriteLine(string)
        L_000d: ret 
    }
    
    .method public static void Test2(bool condition) cil managed
    {
        .maxstack 8
        L_0000: ldarg.0 
        L_0001: brtrue.s L_000d
        L_0003: ldstr "condition was false."
        L_0008: call void [mscorlib]System.Console::WriteLine(string)
        L_000d: ret 
    }
    

答案 1 :(得分:0)

让我冒险回答这个问题:

两种方式都没有错。它是基于意见的。如果你的问题因此而被关闭,我不会被冒犯。

我相信,出现这种情况有三个主要原因

  1. 人们喜欢首先列出的积极情况,空或不
  2. 人们编写代码是因为他们认为会有积极的条件
  3. 人们在稍后将if-else构建完整
  4. 时从正面条件中移除代码

答案 2 :(得分:0)

两种方法都是正确的。一个在另一个上没有明显的改善。

有时人们这样编码的原因是为了简单起见。如果你使用太多的否定,有时逻辑会变得混乱。

例如:“我们不需要任何教育”实际上意味着“我们确实需要教育”

有时编码人员会得到类似的结构,为未来的逻辑修正做准备。

答案 3 :(得分:0)

首先,没有性能影响,所以不要让你烦恼。其次,如果存在性能影响,除了最极端的情况外,在所有情况下都不会担心。所以忘掉性能,这不是性能。

那么,关于为什么要这样做的问题是:为了清楚地识别意图。它表明两个分支都已被考虑过。我个人在极少数情况下这样做,我想明确表示正确的做法是:没有。如果那时不做任何分支并不是最重要的事情,那就不要这样做了。