2011-12-15 10 views
10

मैं बहुत की तरह एक वर्ग को परिभाषित उपयोग करने के लिए शुरू कर दिया है:Defines.Debug बनाम #if डीबग

internal sealed class Defines 
{ 
    /// <summary> 
    /// This constant is set to true iff the define DEBUG is set. 
    /// </summary> 
    public const bool Debug = 
    #if DEBUG 
    true; 
    #else 
    false; 
    #endif 
} 

फायदे मैं देख रहा हूँ है:

  1. यह सुनिश्चित करता है मैं सामान नहीं टूटते साथ कि एक #if .. # else .. # endif संकलक द्वारा चेक नहीं किया जाएगा।
  2. मैं यह देखने के लिए एक खोज संदर्भ कर सकता हूं कि इसका उपयोग कहां किया जाता है।
  3. डीबग के लिए एक बूल रखना अक्सर उपयोगी होता है, परिभाषित करता है कि कोड लंबा/अधिक गन्दा है।

संभावित नुकसान मैं देख रहा हूँ: अगर परिभाषित वर्ग एक और विधानसभा में है

संकलक अप्रयुक्त कोड अनुकूलित नहीं कर सकते। यही कारण है कि मैंने आंतरिक बना दिया है।

क्या मुझे कोई अन्य नुकसान याद आ रहा है?

[संपादित करें] उपयोग के विशिष्ट उदाहरण:

private readonly Permissions _permissions = Defines.Debug ? Permissions.NewAllTrue() 
                  : Permissions.NewAllFalse(); 

या:

var str = string.Format(Defines.Debug ? "{0} {1} ({2})" : "{0} {1}", actual, text, advance); 
+6

क्या आपने ['ConditionalAttribute'] (http://msdn.microsoft.com/en-us/library/system.diagnostics.conditionalattribute.aspx) को देखा है? – Oded

+0

@ ओडेड धन्यवाद, मैंने सामान्य उदाहरणों को जोड़ा है, केवल एकल विधियों में छोटे बदलाव, पूरे विधियों या कक्षाओं को नहीं, जो सशर्त एट्रिब्यूट सूट हैं, या मुझे इन आलसी के लिए दो तरीकों को परिभाषित नहीं करना चाहिए? – weston

+1

क्या होता है यदि इसमें असेंबली 'डीबग' में बनाई गई है लेकिन इसका संदर्भ देने वाले लोग 'रिलीज' में बने हैं? – Oded

उत्तर

6

मैं देख रहा हूँ कम से कम एक बड़ा नुकसान: अगर Debug गलत है, इस कोड को एक चेतावनी के कारण होगा:

if (Debug) 
    Console.WriteLine("Debug"); 

क्योंकि संकलक यह पता लगाएगा कि स्थिति कभी नहीं मिली है, इसलिए Console.WriteLine कॉल पहुंच योग्य नहीं है।

+0

ओह हाँ, यह बहुत परेशान है। मुझे लगता है कि मैं तब @ ओडेड सुझाव में देखूंगा। – weston

संबंधित मुद्दे