我想知道如果下面的表達式是相同的(在C#):C#:(float)(x/y)和x /(float)y之間是否有區別?
float x = ... ;
int y = ... ;
var result = (float) (x/y);
Versus:
var result = x/(float)y;
我在哪裏可以閱讀更多關於這個特定的主題?
我所感興趣的是:
- 將這些總是產生相同的結果?
- 一個選項比另一個更有效嗎?
我想知道如果下面的表達式是相同的(在C#):C#:(float)(x/y)和x /(float)y之間是否有區別?
float x = ... ;
int y = ... ;
var result = (float) (x/y);
Versus:
var result = x/(float)y;
我在哪裏可以閱讀更多關於這個特定的主題?
我所感興趣的是:
是的,他們的行爲方式相同。事實上,你可以使用:的C#4規格顯示哪些部門運營商繳費
var result = x/y;
或
float result = x/y;
第7.8.2節 - 而且也沒有float operator /(float, int)
運營商。相反,C#編譯器使用從int
到float
的隱式轉換,並使用float operator /(float, float)
運算符。
這只是正常的運算符重載分辨率(規範第7.3.4節)和隱式數值轉換(規範第6.1.2節)。
如有疑問,請參閱規格。我有一個web page with links to the different versions; C#5規範與VS 2012捆綁在一起,但目前沒有單獨下載。
隱式轉換(方法調用?)與鑄造(我不知道但可能涉及方法調用?)之間有任何顯着不同嗎? –
@ lysergic-acid:不,這裏沒有方法調用。這只是隱式轉換和顯式轉換之間的區別,這只是源代碼的一個問題(因爲它們在兩種情況下都是相同的轉換)。 –
根本沒有區別。生成的IL代碼是相同的:
下面介紹一下IL反彙編返回這兩種型號:
// Code size 16 (0x10)
.maxstack 2
.locals init ([0] float32 x,
[1] int32 y,
[2] float32 result)
IL_0000: nop
IL_0001: ldc.r4 1.5
IL_0006: stloc.0
IL_0007: ldc.i4.1
IL_0008: stloc.1
IL_0009: ldloc.0
IL_000a: ldloc.1
IL_000b: conv.r4
IL_000c: div
IL_000d: conv.r4
IL_000e: stloc.2
IL_000f: ret
我聽說有一位作者寫了一本關於C#的書。 –
你可以閱讀更多的MSDN和C#規範。 –
有沒有有用的答案?如果是這樣,請隨時接受。 –