37

私のアプリケーションには、次のような構成オプションがいくつかあります。

const bool ExecuteThis=true;
const bool ExecuteThat=false;

そしてそれを使用するコードは次のようになります

if(ExecuteThis){ DoThis(); }
if(ExecuteThat){ DoThat(); } //unreachable code warning here

重要なのは、ExecuteThisやExecuteThatではなく、わずかに異なるリリースを作成する可能性があることです。また、実行時にそのようなものから速度のペナルティが発生しないように、constsを使用できるようにしたいと考えています。しかし、到達不能コードに関する警告を見るのはうんざりです。私はすべての警告を取り除くのが好きな人ですが、これらについては何もできません。これらの警告だけをオフにするために使用できるオプションはありますか?

4

8 に答える 8

59

無効にするには:

#pragma warning disable 0162

復元するには:

#pragma warning restore 0162

詳細については、 MSDN#pragma warningを参照してください。

C#コンパイラは、到達不能コードを出力しないように十分に最適化されていることに注意してください。これはデッドコード除去と呼ばれ、C#コンパイラが実行する数少ない最適化の1つです。

そして、あなたは気ままに警告を無効にすべきではありません。警告は問題の症状です。この回答をご覧ください。

于 2009-12-18T21:30:20.480 に答える
24

まず第一に、私はあなたに同意します、あなたはすべての警告を取り除く必要があります。あなたが得る小さな警告ごとに、問題を修正することによってそれを取り除きます。

再読すると、暴言のように見えるものに進む前に、このようなコードを使用してもパフォーマンスが低下することはないように思われることを強調しておきます。Reflectorを使用してコードを調べたところ、到達不能として「フラグが立てられた」コードは、実際には出力アセンブリに配置されていないようです。

ただし、コンパイラによってチェックされます。これだけでも、私の暴言を無視するのに十分な理由かもしれません。

言い換えれば、その警告を取り除くことの正味の効果はまさにそれであり、あなたは警告を取り除くのです。

また、この回答は意見であることに注意してください。あなたは私の意見に同意しないかもしれません、そして#pragma警告メッセージを隠すために使用したいと思うかもしれませんが、少なくともそれが何をするかについて情報に基づいた意見を持っています。もしそうなら、誰が私の考えを気にします。

そうは言っても、なぜ到達できないコードを書いているのですか?

「defines」の代わりにconstsを使用していますか?

警告はエラーではありません。あなたにとって、そのコードの一部を分析し、あなたが正しいことをしたかどうかを理解することはメモです。通常、あなたはしていません。特定の例の場合、特定の構成では実行されないコードを意図的にコンパイルしています。

なぜコードがそこにあるのですか?実行されることはありません。

「一定」という言葉が実際に何を意味するのか混乱していますか?定数とは、「これは決して変わらない、そしてあなたがそう思うなら、それは定数ではない」という意味です。それが定数です。変更することはなく、変更することも、変更するべきではありません。これまで。

コンパイラはこれを認識しており、定数のために実行されることのないコードがあることを通知します。これは通常、エラーです。

その定数は変わるのでしょうか?もしそうなら、それは明らかに定数ではありませんが、出力タイプ(Debug、Release)に依存するものであり、「#define」タイプのものなので、それを削除して、代わりにそのメカニズムを使用してください。これにより、コードを読んでいる人にとって、この特定のコードが何に依存しているかが明確になります。Visual Studioは、定義を設定しない出力モードを選択した場合にもコードをグレー表示するので、コードはコンパイルされません。これは、コンパイラ定義が処理するために作成されたものです。

一方、定数が変更されない場合は、何らかの理由でコードを削除すると、コードは必要なくなります。

いずれにせよ、そのコードの警告を無効にするだけの簡単な修正の餌食にならないでください。これは、腰痛の問題を「修正」するためにアスピリンを服用するようなものです。これは短期的な修正ですが、問題を覆い隠します。代わりに根本的な問題を修正してください。

この答えを終えるために、私はあなたの問題に対して全く異なる解決策がないかどうか疑問に思っています。

多くの場合、「到達不能コードが検出されました」という警告が表示されるコードは、次のいずれかのカテゴリに分類されます。

  1. constコンパイラとの(私の意見では)間違った使用法#define。基本的にコンパイラに「このコードは、使用されないことがわかっている場合でも、コンパイルしてください。」と言います。
  2. 間違っている、のように、スローとブレークの両方を含むcase-blockを持つswitch-caseのように、まったく間違っています。
  3. 後続のコードを削除(またはコメントアウト)するのではなく、ある時点でリターンを追加することによってメソッドを短絡した、前の反復からの残りのコード。
  4. 一部の構成設定に依存するコード(つまり、デバッグビルド中にのみ有効)。

あなたが持っているコードが上記の設定のいずれにも当てはまらない場合、あなたの定数が変わる特定のケースは何ですか?それを知っていると、それを処理する方法についてのあなたの質問に答えるより良い方法が得られるかもしれません。

于 2009-12-18T21:38:47.963 に答える
22

代わりにプリプロセッサステートメントを使用するのはどうですか?

#if ExecuteThis
    DoThis();
#endif

#if ExecuteThat
    DoThat();
#endif
于 2009-12-18T21:32:05.407 に答える
11

まあ、#pragmaしかし、それはしかし汚れています。私はもっConditionalAttribute​​と良いのだろうか-すなわち

[Conditional("SOME_KEY")]
void DoThis() {...}
[Conditional("SOME_OTHER_KEY")]
void DoThis() {...}

/の呼び出しは、ビルドでシンボルとして定義されている場合にのみ含まれるようになりました(「条件付きコンパイルシンボル」)。また、構成を変更し、それぞれに異なるシンボルを定義することで、それらを切り替えることができることも意味します。DoThisDoThatSOME_KEYSOME_OTHER_KEY

于 2009-12-18T21:32:10.667 に答える
3

コードで定数が宣言されているという事実は、リリースごとにコードを再コンパイルしていることを示しています。構成ファイルから取得した「定数」を使用していません。

したがって、解決策は簡単です。-構成ファイルに格納されている値から「定数」(フラグ)を設定します-条件付きコンパイルを使用して、次のようにコンパイルされるものを制御します。

#define ExecuteThis
//#define ExecuteThat

public void myFunction() {
#if ExecuteThis
    DoThis();
#endif
#if ExecuteThat
    DoThat();
#endif
}

次に、再コンパイルするときに、正しい#defineステートメントのコメントを外して、正しいコードをコンパイルします。条件付きコンパイルフラグを宣言する方法は他に1つまたは2つありますが、これは例と開始点を示しています。

于 2009-12-18T21:36:17.460 に答える
3

コードを変更せずに「ただそれを取り除く」ための最も簡単な方法は、

#pragma warning disable 0162

警告を抑制したい名前空間、クラス、またはメソッド。

たとえば、これはもう警告をスローしません:

#pragma warning disable 0162
namespace ConsoleApplication4
{
  public class Program
  {
    public const bool something = false;

    static void Main(string[] args)
    {
        if (something) { Console.WriteLine(" Not something" ); }

    } 
 }

ただし、この名前空間内のメソッドが再び警告をスローしないことに注意してください...そしてまあ..警告は理由があります(到達不能になるように計画していなかったときに発生した場合はどうなりますか?)

より安全な方法は、構成ファイルに変数を書き込み、プログラムの最初にそこから変数を読み取ることです。そうすれば、異なるバージョン/リリースにするために再コンパイルする必要さえありません。アプリファイルを変更して:Dに移動するだけです。

速度ペナルティについて..はい..この方法で作成すると、速度ペナルティが照会されます...使用する場合と比較してconst、100分の1ミリ秒以上の速度を気にする必要がない限り、そのようにします。

于 2009-12-18T21:44:55.727 に答える
3

ここにトリックがあります:

    bool FALSE = false;
    if (FALSE) { ... 

これにより、警告が防止されます。待って。「それを使うべきではない、なぜ実行されないコードがあるのか​​」ということはすべてあることを私は知っています。回答:開発中にテストコードを設定する必要があることが多いためです。最終的にあなたはそれを取り除くでしょう。開発中にコードが存在することが重要ですが、常に実行されるわけではありません。

デバッグの目的で、コードの実行を一時的に削除したい場合があります。

関数の実行を一時的に切り捨てたい場合があります。これを使用して、警告を回避できます。

... code .. {bool TRUE = true; if(TRUE)return; }...その他のコード...

これらのことは警告を回避します。一時的な場合は、警告を保持する必要があると言うかもしれません。はい...しかし、もう一度...そのようにチェックするべきではないかもしれませんが、たとえば1日中過ごす場合は、一時的に警告を出すと便利です。複雑な衝突コードのデバッグ。

それで、あなたは尋ねるかもしれません、なぜそれが重要なのですか?F4キーを押して最初のエラーに移動すると、これらの警告は非常に煩わしくなり、代わりに最初に10個の警告が表示され、デバッグにひざまずきます。

#pragmaを使用してください。プロジェクト全体でグローバルにそれを行う方法を見つけることができないことを除いて、それは良い考えです。または、C#でコーディングするUnity3Dで動作する方法を見つけることができます。ああ、#includeはどれほど便利でしょう。

気にしないで、#ifを使用してください!ええと...はい...しかし時々彼らはあなたが望むものではありません。それらはコードを乱雑で読めないものにします。コードを適切に括弧で囲む必要があります。ブロックの前にif(false)を置くのはとても簡単です...ブロックを区切る必要はありません、中括弧はそれを行います。

私がしていることは、グローバルにアクセス可能な素敵なFALSEとTRUEを作成し、エラーを回避するために必要に応じてそれらを使用することです。

そして、実際にそれらを使用しているかどうかを確認したい場合は、すべての参照を検索できますが、より大雑把に言えば、同様に効果的にそれらを削除して、この小さなトリックのすべての発生を調べることを余儀なくされます。

于 2014-09-28T19:25:48.697 に答える
2

最も簡単な方法は、到達不能コードの記述を停止することです:D #DontDoThat

于 2009-12-18T21:34:59.763 に答える