13

我目前正在学习 C# 中的运算符和表达式,并且我知道如果我想将变量的值增加 5,我可以通过两种不同的方式来实现:a = a + 5a += 5. 显然,第二种方式写起来更容易、更快,读起来也更愉快。但是,在计算机方面,a += 5a = a + 5? 与较长版本的表达式相比,编译和执行所需的时间是否更少?

4

2 回答 2

14

但是,在计算机方面,a += 5 是否比 a = a + 5 快?

两者相同, first( a += 5) 等于 second a = a + 5

你可能会看到:

+= 运算符(C# 参考)

使用+=赋值运算符的表达式,例如,除了 x 只计算一次外,x += y 等价于。+ 运算符的含义取决于 x 和 y 的类型(数字操作数的加法、字符串操作数的连接等)。x = x + y

因此,这取决于类型,a并且在多个线程访问您的变量的情况下,a您可能会得到不同的结果。但对于大多数其他情况,它是相同的:

对于代码:

static void Main(string[] args)
{
    int a = 10;
    a += 5;
    Console.WriteLine(a);
}

在发布模式下构建 IL

.method private hidebysig static void  Main(string[] args) cil managed
{
  .entrypoint
  // Code size       14 (0xe)
  .maxstack  2
  .locals init ([0] int32 a)
  IL_0000:  ldc.i4.s   10
  IL_0002:  stloc.0
  IL_0003:  ldloc.0
  IL_0004:  ldc.i4.5
  IL_0005:  add
  IL_0006:  stloc.0
  IL_0007:  ldloc.0
  IL_0008:  call       void [mscorlib]System.Console::WriteLine(int32)
  IL_000d:  ret
} // end of method Program::Main

通过代码生成相同的 IL:

static void Main(string[] args)
{
    int a = 10;
    a = a + 5;
    Console.WriteLine(a);
}

IL(相同)是:

.method private hidebysig static void  Main(string[] args) cil managed
{
  .entrypoint
  // Code size       14 (0xe)
  .maxstack  2
  .locals init ([0] int32 a)
  IL_0000:  ldc.i4.s   10
  IL_0002:  stloc.0
  IL_0003:  ldloc.0
  IL_0004:  ldc.i4.5
  IL_0005:  add
  IL_0006:  stloc.0
  IL_0007:  ldloc.0
  IL_0008:  call       void [mscorlib]System.Console::WriteLine(int32)
  IL_000d:  ret
} // end of method Program::Main
于 2013-11-05T16:49:16.877 回答
7

这取决于是什么aa = a + 5评估a两次。 只a += 5计算a一次

如果是一个整数,那么在大多数a情况下,这种差异可能并不重要,尽管并非严格意义上的所有情况。例如,如果从多个线程访问,那么竞争条件的确切类型和窗口可能会有所不同。a

最重要的是,如果评估表达式会导致副作用,那就是观察一次与观察两次的副作用之间的差异。在某些情况下,这可能是一件大事,可能会影响代码的正确性,而不仅仅是它的速度。

于 2013-11-05T16:54:53.080 回答