5

Visual Studio で C# のサンプル式を試してみたところ

public int Test()
{
    if (10/2 == 5)
        throw new Exception();
    return 0;
}

式 10/2 == 5 を保持すると、vs.net は自動的に「到達不能なコードが検出されました」という警告をスローします。

式 10/2 == 6 を変更すると、IDE は満足しますか? それはどのように起こりますか?

編集済み: 不完全な質問で申し訳ありません。それはすぐに起こり、コードをコンパイルする前でも起こりますか?

各返信に賛成票を投じ、FIFOベースで最初の回答を受け入れました

4

7 に答える 7

9
if (10/2 == 5)

常にtrueを返します。つまり、

throw new Exception();

常に実行され、

return 0;

到達することはありません

于 2012-08-14T14:45:04.257 に答える
4

他の人が言ったように、コンパイラは定数10 / 2 == 5式であるため、コンパイル時に式を評価できます。と評価されるため、スコープの後のコードは認識できません。に変更すると、のコードにアクセスできなくなります。trueiffalseif

したがって、次のコードを検討してください。

public int TestA() 
{ 
    if (10 / 2 == 5) 
        return 1; 
    return 0; 
} 

public int TestB() 
{ 
    if (10 / 2 == 6) 
        return 1; 
    return 0; 
} 

どちらの方法でも、到達不能コードに関する警告が生成されます!

C# コンパイラの奇妙な点は、到達不能コードが完全にthrowステートメントで構成されている場合、到達不能に関する警告が発行されないことです

追加:このスタックオーバーフローの質問は関連しています

于 2012-08-14T15:11:51.227 に答える
4

If you decompile this code, you will end up with:

public int Test()
{
     throw new Exception();
}

I believe that since these are constant values, that the math is done at compile time, so 10/2 is not really 10/2, but 5...so it becomes trivial for the compiler to realize that 5==5 is always going to be true. In fact, I believe these constants will then automatically be translated into true. The compiler's goal is to optimize out code that is ALWAYS going to repeat and run the processing of it at compile time, rather than running the same processing over and over.

So, basically, the compiler realizes that since the if is always true and the if results in a return (via a throw), so it optimizes out the code that it knows will never be executed. Thus, the decompiled code results in the above.

In fact, the opposite happens if you do the 10/2 == 6, which is "constantized" into 5 == 6, which is turned into false. Since the if will always be false, it optimizes out the if:

public int Test()
{
    int num = 0;
    return num;
}
于 2012-08-14T14:47:10.907 に答える
3

線が不平を言っている

return 0;

到達することはできません。10/2は常に5に等しくなります。

于 2012-08-14T14:46:09.470 に答える
2

最初のケースでは、コンパイラーが式10/2 == 5を処理します。式はtrueと評価されるため、例外がスローされ、return 0ステートメントに到達できません。

2番目のケースでは、10/2 == 6はfalseと評価されるためreturn 0、例外がスローされないため、ステートメントに到達できます。

編集への応答:コード行が到達不能であることをコンパイラーが認識するために、コードを実際にコンパイルする必要はありません。10/2 == 5ユーザー入力に関係なく、それが常に真であることを知るのは十分に賢いです。つまり、例外が常にスローされます。

于 2012-08-14T14:45:51.930 に答える
1

コンパイラは十分に賢く (これは非常に単純なチェックです)、戻り値 0 に決して到達しないと判断します。これは、10/2 == 5 が常に真になるためです。コンパイラによると、次の式は同等に評価されます

if (10/2 == 5)

また

if true

コンパイラがこれを判断できる理由は、数値が変数ではないためです。

于 2012-08-14T14:48:49.510 に答える
1

実際、彼は決して見返りがないことを知っています 0

彼は、10/2 == 5 より下のコード全体が決して解釈されないことを警告するだけです。10/2 は常に 5 になるからです。

同じやり方で:

if (true)
{
     ......
}
else 
{
  .....
}
于 2012-08-14T14:49:52.413 に答える