#ifdef in C #


117

Aşağıdakini yapmak istiyorum ama C ++ yerine C # ile

#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# 

Bu mükemmel yanıtı da kontrol edin , proje dosyası (.csproj) aracılığıyla koşullara göre hata ayıklama sembollerini nasıl ekleyebileceğinizi gösterir.
Matt

Yanıtlar:


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

Derleme özelliklerinizde DEBUG'ı tanımlamak için onay kutusunun işaretli olduğundan emin olun.


52

Koşullu Özniteliği kullanmanızı tavsiye ederim !

Güncelleme: 3.5 yıl sonra

Bunun gibi kullanabilirsiniz #if( örnek MSDN'den kopyalanmıştır ):

// 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
    }
}

Yalnızca yöntem parçalarını hariç tutmak için kullanışlıdır.

#ifBazı yöntemi derlemeden hariç tutmak için kullanırsanız , bu yöntemi de çağıran tüm kod parçalarını derlemeden hariç tutmanız gerekir (bazen çalışma zamanında bazı sınıfları yükleyebilir ve arayanı "Tüm başvuruları bul" ile bulamazsınız). Aksi takdirde hatalar olacaktır.

Öte yandan, koşullu derlemeyi kullanırsanız, yöntemi çağıran tüm kod parçalarını yine de bırakabilirsiniz. Tüm parametreler yine de derleyici tarafından doğrulanacaktır. Yöntem, çalışma zamanında çağrılmayacaktır . Metodu bir kez gizlemenin ve onu çağıran tüm kodu kaldırmanın daha iyi olduğunu düşünüyorum. Koşullu özniteliği değer döndüren yöntemlerde kullanmanıza izin verilmez - yalnızca void yöntemlerinde. Ama bunun büyük bir sınırlama olduğunu sanmıyorum çünkü kullanırsanız#if bir değer döndüren bir yöntemle , onu çağıran tüm kod parçalarını da gizlemeniz gerekir.

İşte bir örnek:

    // Class1.ConditionalMethod () çağrısı çalışma zamanında yok sayılacak 
    // DEBUG sabiti tanımlanmadıkça


    System.Diagnostics kullanarak;
    sınıf Sınıf1 
    {
       [Koşullu ( "DEBUG")]
       public static void ConditionalMethod () {
          Console.WriteLine ("Yürütülen Class1.ConditionalMethod");
       }
    }

Özet:

#ifdefC ++ ' da kullanırdım ama C # / VB ile Koşullu özniteliği kullanırdım. Bu şekilde, onu çağıran kod parçalarını gizlemek zorunda kalmadan yöntem tanımını gizlersiniz. Çağıran kod hala derleyici tarafından derlenir ve doğrulanır, ancak yöntem çalışma zamanında çağrılmaz. #ifBağımlılıkları önlemek için kullanmak isteyebilirsiniz, çünkü Koşullu öznitelik ile kodunuz hala derlenmiştir.


1
+1 Bu gerçekten güzel, ancak koşullu bir yöntemden bir değer döndürmeye çalıştığınızda (bunu anladığım kadarıyla) sınırlamaları var. Satır içi bir örnek yardımcı olur sanırım.
Hamish Grubijan

1
Ayrıca kodun derlenmesini engellemez, sadece bu koda izin vermez. Bağımlılıkları ve benzerlerini kaldırmak istediğinizde ayrım önemlidir.
Lee Louviere

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.