我有几个同事以我以前从未见过的方式实现 if-else 逻辑,这让我感到困惑。
他们写...
If <someCondition> Then
Else
Console.WriteLine("Hello, World")
...代替
If Not <someCondition> Then
Console.WriteLine("Hello, World")
这让我思考
这两种方法有什么区别吗?一种方法比另一种更有效吗?
我有几个同事以我以前从未见过的方式实现 if-else 逻辑,这让我感到困惑。
他们写...
If <someCondition> Then
Else
Console.WriteLine("Hello, World")
...代替
If Not <someCondition> Then
Console.WriteLine("Hello, World")
这让我思考
这两种方法有什么区别吗?一种方法比另一种更有效吗?
问题:“这两种方法有什么区别吗?”
答:不,没有区别。
问题:“一种方法比另一种更有效吗?”
答:不,它们都同样有效。
我怎么知道这个?
好吧,在这种情况下,很容易通过创建一个测试项目并查看编译的 IL(发布配置)来确定差异。
我使用带有 .NET 4.5.2 的 Visual Studio Community 2015 创建了一个控制台应用程序。作为反编译器,我使用了 .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.
伊利诺伊州
如前所述,并在下面确认,这两种方法是相同的。
.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
}
两种方法都是正确的。一个比另一个没有明显的改进。
有时人们这样编码的原因是为了简单。如果你使用太多的否定,有时逻辑会变得混乱。
例如:“我们不需要教育”实际上意味着“我们确实需要教育”
有时,编码人员也会得到类似的结构,为未来的逻辑修改做准备。
让我冒险回答这个问题:
两种方式都没有错。它是高度基于意见的。如果您的问题因此而被关闭,我不会生气。
我相信,出现这种情况的主要原因有 3 个
if-else
结构完好无损首先,没有性能影响,所以不要让它打扰你。其次,如果存在性能影响,除了最极端的情况外,它太小了,无需担心。所以忘记性能,这与性能无关。
所以,为什么会这样做的问题是:为了清楚地识别意图。它表明两个分支都已被考虑。我个人在极少数情况下这样做了,我想明确表示正确的做法是:什么都不做。如果此时什么都不做分支不是最重要的事情,请不要这样做。