C#の#ifdef


116

以下を実行したいのですが、C ++ではなくC#で

#ifdef _DEBUG
bool bypassCheck=TRUE_OR_FALSE;//i will decide depending on what i am debugging
#else
bool bypassCheck = false; //NEVER bypass it
#endif
c# 

この優れた答えも確認してください。プロジェクトファイル(.csproj)を介して、条件に基づいてデバッグシンボルを追加する方法が示されています。
マット

回答:


162
#if DEBUG
bool bypassCheck=TRUE_OR_FALSE;//i will decide depending on what i am debugging
#else
bool bypassCheck = false; //NEVER bypass it
#endif

ビルドプロパティでDEBUGを定義するためのチェックボックスがオンになっていることを確認してください。


51

条件付き属性を使用することをお勧めします!

アップデート:3.5年後

次の#ifように使用できます(MSDNからコピーした例):

// preprocessor_if.cs
#define DEBUG
#define VC_V7
using System;
public class MyClass 
{
    static void Main() 
    {
#if (DEBUG && !VC_V7)
        Console.WriteLine("DEBUG is defined");
#elif (!DEBUG && VC_V7)
        Console.WriteLine("VC_V7 is defined");
#elif (DEBUG && VC_V7)
        Console.WriteLine("DEBUG and VC_V7 are defined");
#else
        Console.WriteLine("DEBUG and VC_V7 are not defined");
#endif
    }
}

メソッドの一部を除外する場合にのみ役立ちます。

を使用#ifして一部のメソッドをコンパイルから除外する場合は、そのメソッドを呼び出すすべてのコードをコンパイルから除外する必要があります(実行時に一部のクラスをロードし、「すべての参照を検索」で呼び出し元を見つけることができない場合があります)。そうしないと、エラーが発生します。

一方、条件付きコンパイルを使用する場合は、メソッドを呼び出すすべてのコードを残すことができます。すべてのパラメーターは、コンパイラーによって引き続き検証されます。このメソッドは実行時に呼び出されません。メソッドを1回だけ非表示にして、それを呼び出すすべてのコードを削除する必要がない方が良いと思います。値を返すメソッドで条件付き属性を使用することはできません-voidメソッドでのみ。しかし、これが大きな制限であるとは思いません。#if値を返すメソッドで使用する場合、それを呼び出すコードのすべての部分も非表示にする必要があるためです。

次に例を示します。

    // Class1.ConditionalMethod()の呼び出しは実行時に無視されます 
    // DEBUG定数が定義されていない場合


    System.Diagnosticsを使用します。
    クラスClass1 
    {
       [条件付き( "デバッグ")]
       public static void ConditionalMethod(){
          Console.WriteLine( "Executed Class1.ConditionalMethod");
       }
    }

概要:

私は#ifdefC ++で使用しますが、C#/ VBでは条件付き属性を使用します。これにより、メソッドを呼び出すコードを非表示にすることなく、メソッド定義を非表示にすることができます。呼び出しコードは引き続きコンパイラーによってコンパイルおよび検証されますが、メソッドは実行時に呼び出されません。#if条件付き属性を使用してもコードがコンパイルされるため、依存関係を回避するために使用したい場合があります。


1
+1これは確かに便利ですが、条件付きメソッドから値を返そうとするときなど、制限があります(私が理解しているように)。インラインの例が役立つと思います。
Hamish Grubijan

1
また、コードのコンパイルを妨げず、単にそのコードを許可しません。依存関係などを削除したい場合は区別が重要です。
Lee Louviere、2011

1

C#にはプリプロセッサがあります。C ++やCとは少し異なる動作をします。

これがMSDNリンクです。すべてのプリプロセッサディレクティブに関するセクションです。


11
ささいなことですが、C#にはプリプロセッサがありません。#ディレクティブは、プリプロセッサが存在するかのようにメインコンパイラによって処理されます。ここを参照してください:msdn.microsoft.com/en-us/library/ed8yd1ha.aspx この区別の主な結果は、c / c ++スタイルのマクロが機能しないことです。
Simon P Stevens、
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.