#ifdef di C #


116

Saya ingin melakukan hal di bawah ini tetapi dalam C #, bukan 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# 

Periksa jawaban yang sangat bagus ini juga, ini menunjukkan bagaimana Anda dapat menambahkan simbol debug berdasarkan kondisi melalui file proyek (.csproj).
Matt

Jawaban:


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

Pastikan Anda memiliki kotak centang untuk menentukan DEBUG di properti build Anda.


51

Saya akan merekomendasikan Anda menggunakan Atribut Kondisional !

Pembaruan: 3,5 tahun kemudian

Anda dapat menggunakan #ifseperti ini ( contoh disalin dari 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
    }
}

Hanya berguna untuk mengecualikan bagian dari metode.

Jika Anda menggunakan #ifuntuk mengecualikan beberapa metode dari kompilasi, maka Anda harus mengecualikan semua bagian kode yang memanggil metode itu juga dari kompilasi (terkadang Anda dapat memuat beberapa kelas pada waktu proses dan Anda tidak dapat menemukan pemanggil dengan "Temukan semua referensi"). Jika tidak maka akan terjadi kesalahan.

Sebaliknya, jika Anda menggunakan kompilasi bersyarat, Anda masih dapat meninggalkan semua bagian kode yang memanggil metode tersebut. Semua parameter masih akan divalidasi oleh kompilator. Metode ini tidak akan dipanggil saat runtime . Saya pikir lebih baik menyembunyikan metode ini hanya sekali dan tidak harus menghapus semua kode yang memanggilnya juga. Anda tidak diperbolehkan menggunakan atribut kondisional pada metode yang mengembalikan nilai - hanya pada metode kosong. Tetapi menurut saya ini bukan batasan besar karena jika Anda menggunakan #ifmetode yang mengembalikan nilai, Anda harus menyembunyikan semua bagian kode yang memanggilnya juga.

Berikut ini contohnya:

    // memanggil Class1.ConditionalMethod () akan diabaikan saat runtime 
    // kecuali jika konstanta DEBUG ditentukan


    menggunakan System.Diagnostics;
    kelas Kelas 1 
    {
       [Bersyarat ("DEBUG")]
       public static void ConditionalMethod () {
          Console.WriteLine ("Executed Class1.ConditionalMethod");
       }
    }

Ringkasan:

Saya akan menggunakan #ifdefC ++ tetapi dengan C # / VB saya akan menggunakan atribut Conditional. Dengan cara ini Anda menyembunyikan definisi metode tanpa harus menyembunyikan potongan kode yang memanggilnya. Kode panggilan masih dikompilasi dan divalidasi oleh kompilator, meskipun metode ini tidak dipanggil pada waktu proses. Anda mungkin ingin menggunakan #ifuntuk menghindari ketergantungan karena dengan atribut Conditional kode Anda masih dikompilasi.


1
+1 Ini memang bagus, tetapi memiliki keterbatasan, seperti ketika Anda mencoba mengembalikan nilai dari metode bersyarat (seperti yang saya pahami). Saya pikir contoh sebaris akan membantu.
Hamish Grubijan

1
Itu juga tidak mencegah kode untuk dikompilasi, itu sama sekali tidak mengizinkan kode itu. Perbedaan itu penting ketika Anda ingin menghapus dependensi dan semacamnya.
Lee Louviere

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.