这两个分支,哪个效率高? if(){}else{if(){}else{}}if(){}else if(){}else if(){} 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 你这两个比较的东西,好像不是同一个类型的,因为你第二个判断里面,其实没包括全部分支,应该改为if(){}else if(){}else {} 我查看了下IL代码以下是两个小例子:第一种分支C#代码static void Main(string[] args) { int i = 1; if (i < 10) { Console.WriteLine("个位数"); } else { if (i < 100) { Console.WriteLine("十位数"); } else { Console.WriteLine("百位数以上"); } } Console.Read(); }第二种分支C#代码static void Main(string[] args) { int i = 1; if (i < 10) { Console.WriteLine("个位数"); } else if (i < 100) { Console.WriteLine("十位数"); } else { Console.WriteLine("十位数"); } Console.Read(); }以下是两种分支代码的IL代码:第一种分支的IL代码.method private hidebysig static void Main(string[] args) cil managed{ .entrypoint // Code size 79 (0x4f) .maxstack 2 .locals init ([0] int32 i, [1] bool CS$4$0000) IL_0000: nop IL_0001: ldc.i4.1 IL_0002: stloc.0 IL_0003: ldloc.0 IL_0004: ldc.i4.s 10 IL_0006: clt IL_0008: ldc.i4.0 IL_0009: ceq IL_000b: stloc.1 IL_000c: ldloc.1 IL_000d: brtrue.s IL_001e IL_000f: nop IL_0010: ldstr bytearray (2A 4E 4D 4F 70 65 ) // *NMOpe IL_0015: call void [mscorlib]System.Console::WriteLine(string) IL_001a: nop IL_001b: nop IL_001c: br.s IL_0048 IL_001e: nop IL_001f: ldloc.0 IL_0020: ldc.i4.s 100 IL_0022: clt IL_0024: ldc.i4.0 IL_0025: ceq IL_0027: stloc.1 IL_0028: ldloc.1 IL_0029: brtrue.s IL_003a IL_002b: nop IL_002c: ldstr bytearray (41 53 4D 4F 70 65 ) // ASMOpe IL_0031: call void [mscorlib]System.Console::WriteLine(string) IL_0036: nop IL_0037: nop IL_0038: br.s IL_0047 IL_003a: nop IL_003b: ldstr bytearray (7E 76 4D 4F 70 65 E5 4E 0A 4E ) // ~vMOpe.N.N IL_0040: call void [mscorlib]System.Console::WriteLine(string) IL_0045: nop IL_0046: nop IL_0047: nop IL_0048: call int32 [mscorlib]System.Console::Read() IL_004d: pop IL_004e: ret} // end of method Program::Main第二种分支的IL代码.method private hidebysig static void Main(string[] args) cil managed{ .entrypoint // Code size 77 (0x4d) .maxstack 2 .locals init ([0] int32 i, [1] bool CS$4$0000) IL_0000: nop IL_0001: ldc.i4.1 IL_0002: stloc.0 IL_0003: ldloc.0 IL_0004: ldc.i4.s 10 IL_0006: clt IL_0008: ldc.i4.0 IL_0009: ceq IL_000b: stloc.1 IL_000c: ldloc.1 IL_000d: brtrue.s IL_001e IL_000f: nop IL_0010: ldstr bytearray (2A 4E 4D 4F 70 65 ) // *NMOpe IL_0015: call void [mscorlib]System.Console::WriteLine(string) IL_001a: nop IL_001b: nop IL_001c: br.s IL_0046 IL_001e: ldloc.0 IL_001f: ldc.i4.s 100 IL_0021: clt IL_0023: ldc.i4.0 IL_0024: ceq IL_0026: stloc.1 IL_0027: ldloc.1 IL_0028: brtrue.s IL_0039 IL_002a: nop IL_002b: ldstr bytearray (41 53 4D 4F 70 65 ) // ASMOpe IL_0030: call void [mscorlib]System.Console::WriteLine(string) IL_0035: nop IL_0036: nop IL_0037: br.s IL_0046 IL_0039: nop IL_003a: ldstr bytearray (41 53 4D 4F 70 65 ) // ASMOpe IL_003f: call void [mscorlib]System.Console::WriteLine(string) IL_0044: nop IL_0045: nop IL_0046: call int32 [mscorlib]System.Console::Read() IL_004b: pop IL_004c: ret} // end of method Program::Main 第一分支相比第二分支,除了多了2个nop辅助debug的空指令,其他都一样,可以说两者执行效率上应该没区别下面是没有nop的Release版本的IL代码:第一种分支的IL代码.method private hidebysig static void Main(string[] args) cil managed{ .entrypoint // Code size 53 (0x35) .maxstack 2 .locals init ([0] int32 i) IL_0000: ldc.i4.1 IL_0001: stloc.0 IL_0002: ldloc.0 IL_0003: ldc.i4.s 10 IL_0005: bge.s IL_0013 IL_0007: ldstr bytearray (2A 4E 4D 4F 70 65 ) // *NMOpe IL_000c: call void [mscorlib]System.Console::WriteLine(string) IL_0011: br.s IL_002e IL_0013: ldloc.0 IL_0014: ldc.i4.s 100 IL_0016: bge.s IL_0024 IL_0018: ldstr bytearray (41 53 4D 4F 70 65 ) // ASMOpe IL_001d: call void [mscorlib]System.Console::WriteLine(string) IL_0022: br.s IL_002e IL_0024: ldstr bytearray (7E 76 4D 4F 70 65 E5 4E 0A 4E ) // ~vMOpe.N.N IL_0029: call void [mscorlib]System.Console::WriteLine(string) IL_002e: call int32 [mscorlib]System.Console::Read() IL_0033: pop IL_0034: ret} // end of method Program::Main第二种分支的IL代码.method private hidebysig static void Main(string[] args) cil managed{ .entrypoint // Code size 53 (0x35) .maxstack 2 .locals init ([0] int32 i) IL_0000: ldc.i4.1 IL_0001: stloc.0 IL_0002: ldloc.0 IL_0003: ldc.i4.s 10 IL_0005: bge.s IL_0013 IL_0007: ldstr bytearray (2A 4E 4D 4F 70 65 ) // *NMOpe IL_000c: call void [mscorlib]System.Console::WriteLine(string) IL_0011: br.s IL_002e IL_0013: ldloc.0 IL_0014: ldc.i4.s 100 IL_0016: bge.s IL_0024 IL_0018: ldstr bytearray (41 53 4D 4F 70 65 ) // ASMOpe IL_001d: call void [mscorlib]System.Console::WriteLine(string) IL_0022: br.s IL_002e IL_0024: ldstr bytearray (7E 76 4D 4F 70 65 E5 4E 0A 4E ) // ~vMOpe.N.N IL_0029: call void [mscorlib]System.Console::WriteLine(string) IL_002e: call int32 [mscorlib]System.Console::Read() IL_0033: pop IL_0034: ret} // end of method Program::Main两者完全一样,那执行应该没区别了 第二个分支的IL代码有一句拷错了IL_003a: ldstr bytearray (41 53 4D 4F 70 65 ) // ASMOpe改为IL_003a: ldstr bytearray (7E 76 4D 4F 70 65 E5 4E 0A 4E ) // ~vMOpe.N.N不影响这个例子的说明 我用最简单的话说吧 if只能搭配一个elseif(){}else{}这样就是二选一执行if(){}else if(){} else{}这样是从开头到结尾都要判断一次 也就是进去后直到遇到else{}才结束 但是很多时候我们都用switch(){ case XX:break; default: break};来代替 if(){} else if().. if(){}else if(){}else if(){}效率高,第一个if成立,后面的都不会执行判断全是if的话,每个if都要判断一遍 if(){}else if(){}else if(){}等效于case语句 第二分支的C#代码里面最后一句输出应该是Console.WriteLine("百位数以上");也就是导致IL不一致的原因,额,赋值代码惹的祸 当if用来判断的变量volatile的话,两者的逻辑不等价。 说实话,你这两种写法其实是一样的。if (a>1){ Console.Write("a大于1");}else{ Console.Write("a小于等于1");}if (a>1) Console.Write("a大于1");else Console.Write("a小于等于1");这两个是一样的,当if条件只带一行代码时,可以省略{}。也就是说if (){}else if{}实际上就是if (){}else{ if(){ }} if(){}else if(){},这样的结构不清晰;if(){}else if(){}这样的写法结构清晰,易于排错! 第二种 不是遇到else 才结束,是遇到符合条件的就结束、 哇,CSDN上面的确是高手云集啊。 C# 输入控件TextBox样式问题 .net 模式窗口 问题 关于播放mp3的问题 .net c#开发的window应用程序,如何使其只运行一个 循环的问题 Windows服务的问题,急啊,麻烦高手进!急!~~~~~~~~ 在WINFORM中DATAGRID数据表格中,对列进行排序,如果该列都是数字则进行升序和降序就不对啦!兄弟们有办法解决吗? 关于如何不让3721屏蔽页面的问题 程序打包后在别的机子上不能运行,Help!!!!!!! 芝麻开门,请进!送佛送到西!再问你一个问题。还是datagrid的! 为什么使用VSS签出的文件不能修改? 怎样获取当当网库存信息?
应该改为
if(){}
else if(){}
else {}
{
int i = 1;
if (i < 10)
{
Console.WriteLine("个位数");
}
else
{
if (i < 100)
{
Console.WriteLine("十位数");
}
else
{
Console.WriteLine("百位数以上");
}
}
Console.Read();
}
第二种分支C#代码static void Main(string[] args)
{
int i = 1;
if (i < 10)
{
Console.WriteLine("个位数");
}
else if (i < 100)
{
Console.WriteLine("十位数");
}
else
{
Console.WriteLine("十位数");
}
Console.Read();
}
以下是两种分支代码的IL代码:第一种分支的IL代码.method private hidebysig static void Main(string[] args) cil managed
{
.entrypoint
// Code size 79 (0x4f)
.maxstack 2
.locals init ([0] int32 i,
[1] bool CS$4$0000)
IL_0000: nop
IL_0001: ldc.i4.1
IL_0002: stloc.0
IL_0003: ldloc.0
IL_0004: ldc.i4.s 10
IL_0006: clt
IL_0008: ldc.i4.0
IL_0009: ceq
IL_000b: stloc.1
IL_000c: ldloc.1
IL_000d: brtrue.s IL_001e
IL_000f: nop
IL_0010: ldstr bytearray (2A 4E 4D 4F 70 65 ) // *NMOpe
IL_0015: call void [mscorlib]System.Console::WriteLine(string)
IL_001a: nop
IL_001b: nop
IL_001c: br.s IL_0048
IL_001e: nop
IL_001f: ldloc.0
IL_0020: ldc.i4.s 100
IL_0022: clt
IL_0024: ldc.i4.0
IL_0025: ceq
IL_0027: stloc.1
IL_0028: ldloc.1
IL_0029: brtrue.s IL_003a
IL_002b: nop
IL_002c: ldstr bytearray (41 53 4D 4F 70 65 ) // ASMOpe
IL_0031: call void [mscorlib]System.Console::WriteLine(string)
IL_0036: nop
IL_0037: nop
IL_0038: br.s IL_0047
IL_003a: nop
IL_003b: ldstr bytearray (7E 76 4D 4F 70 65 E5 4E 0A 4E ) // ~vMOpe.N.N
IL_0040: call void [mscorlib]System.Console::WriteLine(string)
IL_0045: nop
IL_0046: nop
IL_0047: nop
IL_0048: call int32 [mscorlib]System.Console::Read()
IL_004d: pop
IL_004e: ret
} // end of method Program::Main
第二种分支的IL代码.method private hidebysig static void Main(string[] args) cil managed
{
.entrypoint
// Code size 77 (0x4d)
.maxstack 2
.locals init ([0] int32 i,
[1] bool CS$4$0000)
IL_0000: nop
IL_0001: ldc.i4.1
IL_0002: stloc.0
IL_0003: ldloc.0
IL_0004: ldc.i4.s 10
IL_0006: clt
IL_0008: ldc.i4.0
IL_0009: ceq
IL_000b: stloc.1
IL_000c: ldloc.1
IL_000d: brtrue.s IL_001e
IL_000f: nop
IL_0010: ldstr bytearray (2A 4E 4D 4F 70 65 ) // *NMOpe
IL_0015: call void [mscorlib]System.Console::WriteLine(string)
IL_001a: nop
IL_001b: nop
IL_001c: br.s IL_0046
IL_001e: ldloc.0
IL_001f: ldc.i4.s 100
IL_0021: clt
IL_0023: ldc.i4.0
IL_0024: ceq
IL_0026: stloc.1
IL_0027: ldloc.1
IL_0028: brtrue.s IL_0039
IL_002a: nop
IL_002b: ldstr bytearray (41 53 4D 4F 70 65 ) // ASMOpe
IL_0030: call void [mscorlib]System.Console::WriteLine(string)
IL_0035: nop
IL_0036: nop
IL_0037: br.s IL_0046
IL_0039: nop
IL_003a: ldstr bytearray (41 53 4D 4F 70 65 ) // ASMOpe
IL_003f: call void [mscorlib]System.Console::WriteLine(string)
IL_0044: nop
IL_0045: nop
IL_0046: call int32 [mscorlib]System.Console::Read()
IL_004b: pop
IL_004c: ret
} // end of method Program::Main
{
.entrypoint
// Code size 53 (0x35)
.maxstack 2
.locals init ([0] int32 i)
IL_0000: ldc.i4.1
IL_0001: stloc.0
IL_0002: ldloc.0
IL_0003: ldc.i4.s 10
IL_0005: bge.s IL_0013
IL_0007: ldstr bytearray (2A 4E 4D 4F 70 65 ) // *NMOpe
IL_000c: call void [mscorlib]System.Console::WriteLine(string)
IL_0011: br.s IL_002e
IL_0013: ldloc.0
IL_0014: ldc.i4.s 100
IL_0016: bge.s IL_0024
IL_0018: ldstr bytearray (41 53 4D 4F 70 65 ) // ASMOpe
IL_001d: call void [mscorlib]System.Console::WriteLine(string)
IL_0022: br.s IL_002e
IL_0024: ldstr bytearray (7E 76 4D 4F 70 65 E5 4E 0A 4E ) // ~vMOpe.N.N
IL_0029: call void [mscorlib]System.Console::WriteLine(string)
IL_002e: call int32 [mscorlib]System.Console::Read()
IL_0033: pop
IL_0034: ret
} // end of method Program::Main
第二种分支的IL代码.method private hidebysig static void Main(string[] args) cil managed
{
.entrypoint
// Code size 53 (0x35)
.maxstack 2
.locals init ([0] int32 i)
IL_0000: ldc.i4.1
IL_0001: stloc.0
IL_0002: ldloc.0
IL_0003: ldc.i4.s 10
IL_0005: bge.s IL_0013
IL_0007: ldstr bytearray (2A 4E 4D 4F 70 65 ) // *NMOpe
IL_000c: call void [mscorlib]System.Console::WriteLine(string)
IL_0011: br.s IL_002e
IL_0013: ldloc.0
IL_0014: ldc.i4.s 100
IL_0016: bge.s IL_0024
IL_0018: ldstr bytearray (41 53 4D 4F 70 65 ) // ASMOpe
IL_001d: call void [mscorlib]System.Console::WriteLine(string)
IL_0022: br.s IL_002e
IL_0024: ldstr bytearray (7E 76 4D 4F 70 65 E5 4E 0A 4E ) // ~vMOpe.N.N
IL_0029: call void [mscorlib]System.Console::WriteLine(string)
IL_002e: call int32 [mscorlib]System.Console::Read()
IL_0033: pop
IL_0034: ret
} // end of method Program::Main
两者完全一样,那执行应该没区别了
改为
IL_003a: ldstr bytearray (7E 76 4D 4F 70 65 E5 4E 0A 4E ) // ~vMOpe.N.N
不影响这个例子的说明
if(){}else{}这样就是二选一执行
if(){}else if(){} else{}这样是从开头到结尾都要判断一次 也就是进去后直到遇到else{}才结束
else if(){}
else if(){}
效率高,第一个if成立,后面的都不会执行判断全是if的话,
每个if都要判断一遍
else if(){}
else if(){}
等效于case语句
第二分支的C#代码里面最后一句输出应该是Console.WriteLine("百位数以上");也就是导致IL不一致的原因,额,赋值代码惹的祸
if (a>1){
Console.Write("a大于1");
}
else{
Console.Write("a小于等于1");
}if (a>1)
Console.Write("a大于1");
else
Console.Write("a小于等于1");这两个是一样的,当if条件只带一行代码时,可以省略{}。
也就是说
if (){}
else if{}
实际上就是
if (){
}
else{
if(){
}
}
if()
{}
else if()
{}
这样的写法结构清晰,易于排错!