2009-03-17 12 views

Odpowiedz

97
Boolean isDebugMode = false; 
#if DEBUG 
isDebugMode = true; 
#endif 

Jeśli chcesz zaprogramować różne zachowanie między debugowania i uwalniania buduje należy zrobić to tak:

#if DEBUG 
    int[] data = new int[] {1, 2, 3, 4}; 
#else 
    int[] data = GetInputData(); 
#endif 
    int sum = data[0]; 
    for (int i= 1; i < data.Length; i++) 
    { 
    sum += data[i]; 
    } 

Lub jeśli chcesz zrobić niektóre kontrole w wersjach debugowania funkcji można zrobić w następujący sposób:

public int Sum(int[] data) 
{ 
    Debug.Assert(data.Length > 0); 
    int sum = data[0]; 
    for (int i= 1; i < data.Length; i++) 
    { 
    sum += data[i]; 
    } 
    return sum; 
} 

Debug.Assert nie zostanie uwzględniony w kompilacji wydania.

+0

Czy OP prosząc o JIT Zoptymalizowany budować? Jeśli tak, to ta odpowiedź jest niepoprawna. Atrybut debugowania można zadeklarować w zoptymalizowanej kompilacji JIT lub niezoptymalizowanej. –

11

Mam nadzieję, że to będzie przydatne dla Ciebie:

public static bool IsRelease(Assembly assembly) { 
    object[] attributes = assembly.GetCustomAttributes(typeof(DebuggableAttribute), true); 
    if (attributes == null || attributes.Length == 0) 
     return true; 

    var d = (DebuggableAttribute)attributes[0]; 
    if ((d.DebuggingFlags & DebuggableAttribute.DebuggingModes.Default) == DebuggableAttribute.DebuggingModes.None) 
     return true; 

    return false; 
} 

public static bool IsDebug(Assembly assembly) { 
    object[] attributes = assembly.GetCustomAttributes(typeof(DebuggableAttribute), true); 
    if (attributes == null || attributes.Length == 0) 
     return true; 

    var d = (DebuggableAttribute)attributes[0]; 
    if (d.IsJITTrackingEnabled) return true; 
    return false; 
} 
+4

dlaczego obie funkcje mają ten wiersz: if (attributes == null || attributes.Length == 0) return true; Coś jest nie tak z tym kodem. Zleciłem +1, ponieważ odpowiedź zapewnia rzeczywisty, programowy sposób, a nie sposób syntaktyczny, aby uzyskać flagę. czasami jest konieczne, aby wiedzieć, czy tryb debugowania jest wyrażany jako część samego kodu, a nie jako flaga kompilatora. –

+1

Funkcja DebuggableAttribute jest obecna, jeśli kompilujesz w trybie Release i wybierzesz DebugOoutput na coś innego niż "none". Tak więc ta odpowiedź nie jest poprawna. Nie szuka nawet flagi optymalizacji JIT. Zapoznaj się z moim postem na temat odróżniania zarówno ręcznie, jak i programowo - http://dave-black.blogspot.com/2011/12/how-to-tell-if-assembly-is-debug-or.html –

+2

odroczenie @DaveB na trudności w tym zakresie w ogólnym przypadku. Jednak twoje pytanie było szerokie i jeśli po prostu chcesz, aby twój kod zachowywał się inaczej podczas testowania, uważam ten test za użyteczny (w VB.Net) 'If System.Diagnostics.Debugger.IsAttached Then DoSomething '(Takich, jak forma zachowuje się inaczej) ' –