C# 什么样的检查方法比设置值更为理想?

C# 什么样的检查方法比设置值更为理想?,c#,c++,variables,C#,C++,Variables,这是我做了7年程序员后第一篇关于堆栈溢出的文章。。。我有一个很愚蠢的问题。这两者之间什么更有效?C++或C语言编译器是否自动优化它,如果是,它会变成什么? 如果(a)b=a 如果(a)b=真 在C中#在发布模式下,它们都编译为相同的IL .class private auto ansi '<Module>' { } // end of class <Module> .class public auto ansi beforefieldinit C extends

这是我做了7年程序员后第一篇关于堆栈溢出的文章。。。我有一个很愚蠢的问题。这两者之间什么更有效?C++或C语言编译器是否自动优化它,如果是,它会变成什么?

如果(a)b=a
如果(a)b=真
在C中#在发布模式下,它们都编译为相同的IL

.class private auto ansi '<Module>'
{
} // end of class <Module>

.class public auto ansi beforefieldinit C
    extends [mscorlib]System.Object
{
    // Methods
    .method public hidebysig 
        instance void M (
            bool a
        ) cil managed 
    {
        // Method begins at RVA 0x2050
        // Code size 3 (0x3)
        .maxstack 8

        IL_0000: ldarg.1
        IL_0001: pop
        IL_0002: ret
    } // end of method C::M

    .method public hidebysig specialname rtspecialname 
        instance void .ctor () cil managed 
    {
        // Method begins at RVA 0x2054
        // Code size 7 (0x7)
        .maxstack 8

        IL_0000: ldarg.0
        IL_0001: call instance void [mscorlib]System.Object::.ctor()
        IL_0006: ret
    } // end of method C::.ctor

} // end of class C
b==真实版本

// Methods
.method public hidebysig 
    instance void M (
        bool a
    ) cil managed 
{
    // Method begins at RVA 0x2050
    // Code size 9 (0x9)
    .maxstack 1
    .locals init (
        [0] bool,
        [1] bool
    )

    IL_0000: nop
    IL_0001: ldarg.1
    IL_0002: stloc.1
    // sequence point: hidden
    IL_0003: ldloc.1
    IL_0004: brfalse.s IL_0008

    IL_0006: ldc.i4.1
    IL_0007: stloc.0

    IL_0008: ret
} // end of method C::M

实际上,在担心这种微观优化之前,我想先对您的确切用法进行基准测试。这不太可能是你花在优化工作上的时间的最佳价值。

你为什么用C#?因为我使用两种语言,而且我对这两种语言的答案都感兴趣。。。但是我想这有点奇怪。不管怎么说,答案可能是一样的。它们是两种不同的说法。我们能比较一下苹果和橘子吗?哦,我应该具体说明,“a”字面上是一个bool,意思是如果(a)通过。。。“a”是真的。。。因此,将“b”设置为“a”与将“b”设置为“true”是相同的。这两者之间有什么效率更高呢?--这表明你离开C++已经有很长时间了。一个优化的C++编译器将很可能产生相同的代码,如果有机会这样做的话,可能会完全删除它。如果要查看基础程序集,请转到并输入程序。
// Methods
.method public hidebysig 
    instance void M (
        bool a
    ) cil managed 
{
    // Method begins at RVA 0x2050
    // Code size 9 (0x9)
    .maxstack 1
    .locals init (
        [0] bool,
        [1] bool
    )

    IL_0000: nop
    IL_0001: ldarg.1
    IL_0002: stloc.1
    // sequence point: hidden
    IL_0003: ldloc.1
    IL_0004: brfalse.s IL_0008

    IL_0006: ldc.i4.1
    IL_0007: stloc.0

    IL_0008: ret
} // end of method C::M