2014-11-15 43 views
0

我一直使用for (int i = 0; i < 10; i++)在C#中编写for循环。在C#中使用`x + = 1`而不是`++ x`是否有任何副作用?

我一直在阅读关于JavaScript(JavaScript:The Good Parts)的最佳实践,其中之一是更喜欢x += 1而不是x++

有没有什么区别,在C#之间,两者之间在性能,原子性和功能性等方面。

我问,因为有功能在C#++xx++之间的差异(和C++,可能大多数其他基于C语言);前者是预先增加它在哪里增量变量然后返回值,后者是后增加它返回的值,然后增加它(实际上,这两个细微的差异是什么激怒我的兴趣采用在我的C#代码x += 1策略)

更新

这里有两种方法,method1使用++xmethod2使用x += 1

static void method1() 
    { 
     int x = 1; 
     int y = ++x; 

     Console.WriteLine(x); 
     Console.WriteLine(y); 
    } 

    static void method2() 
    { 
     int x = 1; 
     int y = x += 1; 

     Console.WriteLine(x); 
     Console.WriteLine(y); 
    } 

这将产生以下IL:

方法1

enter image description here

方法2

enter image description here

似乎存在一些细微的差别,但是我对IL的理解还不足以回答“这有什么区别”的问题。

+0

你能回答自己这个问题:看IL。 –

+1

它只是C#中的一个语法结构,编译器生成的MSIL是相同的。 –

+0

在C#中,你不应该想到副作用发生时前和后增量之间的差异。在两种情况下评估操作员时都会产生副作用。 [所不同的是在增量或之后返回哪个值。](http://stackoverflow.com/a/3346729/517852) –

回答

3

没有什么区别。中间语言从x += 1x++翻译是相同的:

int x = 0; 
x++; // or x += 1; 

的IL代码:

IL_0001: ldc.i4.0  
IL_0002: stloc.0  // x 
IL_0003: ldloc.0  // x 
IL_0004: ldc.i4.1  
IL_0005: add   
IL_0006: stloc.0  // x 
+0

嗨杰森 - 谢谢你的回答。我用一个例子和一些结果IL更新了这个问题。似乎有小小的差异。 –

+1

@SteveDunn:IL并不是那么重要。我的意思是,如果IL是相同的,那么你可以在那里结束。但即使不同,在优化的JIT编译过程中,可能会擦除很小的差异。这里的底线是,在增加一个整数变量方面,没有什么技术原因可以选择一种语法而不是另一种语法。 –

相关问题