当前位置: 首页 > 编程语言 > C#

“Otherwiseif()”对应C#中的多个“if()”分享

时间:2023-04-11 01:11:29 C#

“Otherwiseif()”对应C#中的多个“if()”这些实际有什么区别?//方法一if(x==1)DoSomething();elseif(x==2)DoSomethingElse();//方法二if(x==1)DoSomething();如果(x==2)DoSomethingElse();生成的CIL是否相同?(存在使用“if/elseif/else”与“if/else{if/else}”的问题,但尚未得到解答。)如果DoSomething将x设置为2,则它们将不同。[STAThread]publicstaticvoidMain(){Int32x=1;如果(x==1)Console.WriteLine("1");否则如果(x==2)Console.WriteLine("2");}结果是:.methodpublichidebysigstaticvoidMain()cilmanaged{.custominstancevoid[mscorlib]System.STAThreadAttribute::.ctor().entrypoint.maxstack2.localsinit([0]int32x)L_0000:ldc.i4.1L_0001:stloc.0L_0002:ldloc.0L_0003:ldc.i4.1L_0004:bne.un.sL_0011L_0006:ldstr"1"L_000b:调用void[mscorlib]System.Console::WriteLine(string)L_0010:retL_0011:ldloc.0L_0012:ldc.i4.2L_0013:bne.un.sL_001fL_0015:ldstr"2"L_001a:callvoid[mscorlib]System.Console::WriteLine(string)L_001f:ret}而:[STAThread]publicstaticvoidMain(){Int32x=1;如果(x==1)Console.WriteLine("1");如果(x==2)Console.WriteLine("2");}结果是:.methodpublichidebysigstaticvoidMain()cilmanaged{.custominstancevoid[mscorlib]System.STAThreadAttribute::.ctor().entrypoint.maxstack2.localsinit([0]int32x)L_0000:ldc.i4.1L_0001:stloc.0L_0002:ldloc.0L_0003:ldc.i4.1L_0004:bne.un.sL_0010L_0006:ldstr"1"L_000b:callvoid[mscorlib]System.控制台::WriteLine(字符串)L_0010:ldloc.0L_0011:ldc.i4.2L_0012:bne.un.sL_001eL_0014:ldstr"2"L_0019:callvoid[mscorlib]System.Console::WriteLine(string)L_001e:ret}IL代码有点不同,这是主要区别:方法一:L_0004:bne.un.sL_0011->L_0011:ldloc.0和L_0010:ret方法二:L_0004:bne.un.sL_0010->L_0010:ldloc.0withnoretinbetweenyouusetheelsestatement,aswiththefirstmethod,onlythefirstbranchthatsatisfiedtheconditionisrunontheotherhand...每个检查都用第二种方法处理,并且会按照and对满足条件的每一个检查进行处理。这是主要区别。这就是为什么在第一种方法的IL代码中,在调用Console.WriteLine之后有一个“ret”指令,而在第二种方法中它不存在。在第一种情况下,该方法可以在检查通过后立即退出,因为不再执行对x的检查...在第二种方法中,您必须按顺序执行所有这些操作,这就是为什么ret只出现在最后一个方法,到最后没有“捷径”。对于我的测试,我使用了Console.WriteLine()调用...但是如果DoSomething()涉及x变量值的变化,那么差异在代码的行为中肯定更重要。假设我们将x设为私有静态成员(初始值始终为1)而不是局部变量,并且:publicvoidDoSomething(){++m_X;在第一个方法中,即使DoSomething()之后m_X假定值为2,否则该方法退出并且永远不会调用DoSomethingElse()。在第二种方法中,调用了两个方法。请注意,在C#中没有elseif构造。您的第一个代码示例与以下代码完全相同:if(x==1)DoSomething();else{如果(x==2)DoSomethingElse();}由于else只有一条语句,大括号可以省略,而且为了增强可读性,if通常和前面的else写在同一行。写多个“elseif”语句相当于进一步嵌套:if(x==1)DoSomething();else{如果(x==2)DoSomethingElse();else{如果(x==3)YetSomethingElse();else{如果(x==4)ReallyDifferent();}}}上面可以写成:if(x==1)DoSomething();elseif(x==2)DoSomethingElse();否则如果(x==3)YetSomethingElse();否则如果(x==4)真的不同();从这里,您可以看到链接“elseif”,if可以产生不同的结果。在“elseif”的情况下,第一个满足条件的分支被执行,之后不再执行进一步的检查。对于链式if语句,所有满足其条件的分支都会被执行。这里的主要区别在于执行分支时会导致后续条件变为真。例如:varx=1;如果(x==1)x=2;否则如果(x==2)x=3;VS变量x=1;如果(x==1)x=2;如果(x==2)x=3;在第一种情况下,x==2,而在第二种情况下,x==3。当你这样编码时//方法二if(x==1)DoSomething();如果(x==2)DoSomethingElse();每次检查条件。但是当你这样编码时if(x==1)DoSomething();elseif(x==2)DoSomethingElse();如果第一个条件为真,那么它不会检查其他条件,从而减少不必要的编译。当您使用else语句时,只会运行一个分支(即第一个满足if条件的分支)。所有其他if甚至不评估条件://approachoneintx=1;如果(x==1)DoSomething();//只有它会运行,即使`DoSomething`将`x`更改为2elseif(x==2)DoSomethingElse();当你不使用它时,它们每个都可以运行(取决于每个条件),即每个都被一个一个地估计://approachtwointx=1;if(x==1)DoSomething();//这是运行的,因为`x`==1if(x==2)DoSomethingElse();//如果`DoSomething`将`x`更改为2,这是也可以运行所以,IL可能会有所不同。没有关于性能的问题?所以如果x=1,在第一种情况下你只做一次检查,而在第二种情况下你做2次检查,所以第一种情况更快。如果x发生变化(在DoSeomthing和DoSomethingElse中),那么第一个语句将只执行一个语句。在第二个例子中,每条语句都会被检查(除非编译器将其优化为用于数值比较的跳转表)。当你使用多个elseif时,它会执行满足的条件。如果还有剩余的案例,它们将被跳过。当您有多个if时,它会检查每个语句。所以这更像是一个性能问题。如果x被多个线程修改,则可以使用第二个方法调用DoSomething()和DoSomethingElse()否则,只有在第一个条件不为真时才会对其进行评估。但是将评估两个连续的if语句。您可以在Python解释器中轻松测试这个概念:首先运行:注意:在Python中,如果a>=1,请使用elif而不是elsea=1:print('aisgreaterthanorequalto1')elifaThen以上就是C#学习教程:“Otherwiseif()”对应C#中的多个“if()”所有内容分享,如果对大家有用需要进一步了解C#学习教程,希望大家多多指教多加注意---a=1ifa>=1:print('aisgreaterthanorequalto1')ifa本文摘自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: