私は現在、C# の演算子と式について学んでおり、変数の値を 5 ずつ増やしたい場合は、2 つの異なる方法で実行できることを理解しました:a = a + 5とa += 5. どうやら、2 番目の方法は、書くのが簡単で速く、読むのがより快適です。ただし、コンピューターに関してはa += 5、a = a + 5? 式の長いバージョンよりもコンパイルと実行にかかる時間が短いですか?
2 に答える
しかし、コンピュータ的には、a += 5 は a = a + 5 よりも高速ですか?
どちらも同じです。 first( a += 5) は second と同じa = a + 5です。
以下が表示される場合があります。
+=などの代入演算子を使用する式は、 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
それは何aであるかによって異なります。 2回 a = a + 5評価します。正確に1 回評価します。aa += 5a
aが整数の場合、厳密にはすべての場合ではありませんが、ほとんどの場合、その違いは問題にならない可能性があります。たとえば、が複数のスレッドからアクセスされる場合、競合状態の正確なタイプとウィンドウは異なる可能性があります。a
その上、式の評価が副作用を引き起こす場合、それは副作用が 1 回観測される場合と 2 回観測される場合の違いです。これは、特定の状況下では大きな問題となり、速度だけでなくコードの正確性にも影響を与える可能性があります。