2010-05-06 8 views
24

मैं अक्सर सिस्टम द्वारा निराश हूं। डायग्नोस्टिक्स। डेबग। राइट/लिखितलाइन विधियां। मैं लिखें/WriteLine तरीकों TextWriter वर्ग से परिचित उपयोग करना चाहते हैं, तो मैं अक्सरक्या सिस्टम में एक टेक्स्टवाइटर इंटरफेस है। डायग्नोस्टिक्स.डेबग क्लास?

Debug.WriteLine("# entries {0} for connection {1}", countOfEntries, connection); 

जो एक संकलक त्रुटि होती है लिखें। मैं

Debug.WriteLine(string.Format("# entries {0} for connection {1}", 
    countOfEntries, connection)); 

लिखना समाप्त करता है जो वास्तव में अजीब है।

क्या सीएलआर में टेक्स्टवाइटर से प्राप्त कक्षा है जो "wraps" सिस्टम। डेबग, या मुझे अपना खुद का रोल करना चाहिए?

उत्तर

8

क्या आपको विशेष रूप से पूरे TextWriter की आवश्यकता है? हालांकि यह कुछ हद तक "त्वरित और गंदी" है मुझे लगता है बस कुछ ही तरीकों के साथ एक स्थिर वर्ग पूरी तरह से अच्छी तरह से करना होगा:

public static class DebugEx 
{ 
    [Conditional("DEBUG")] 
    public static void WriteLine(string format, params object[] args) 
    { 
     Debug.WriteLine(string.Format(format, args)); 
    } 
} 

या कुछ इसी तरह की।

आपको याद है, मैं आउटपुट पर अधिक नियंत्रण देने के लिए व्यक्तिगत रूप से लॉग 4नेट की तरह कुछ देखता हूं।

29

फ़ंक्शन Debug.Print फ़ंक्शनेटिंग और तर्कों का उपयोग करने देता है।

[संपादित करें:]

आप एक TextWriter इंटरफ़ेस का उपयोग करना पसंद करते हैं, तो आप उपयोग कर सकते हैं निम्नलिखित:

public class DebugTextWriter : StreamWriter 
{ 
    public DebugTextWriter() 
     : base(new DebugOutStream(), Encoding.Unicode, 1024) 
    { 
     this.AutoFlush = true; 
    } 

    class DebugOutStream : Stream 
    { 
     public override void Write(byte[] buffer, int offset, int count) 
     { 
      Debug.Write(Encoding.Unicode.GetString(buffer, offset, count)); 
     } 

     public override bool CanRead { get { return false; } } 
     public override bool CanSeek { get { return false; } } 
     public override bool CanWrite { get { return true; } } 
     public override void Flush() { Debug.Flush(); } 
     public override long Length { get { throw new InvalidOperationException(); } } 
     public override int Read(byte[] buffer, int offset, int count) { throw new InvalidOperationException(); } 
     public override long Seek(long offset, SeekOrigin origin) { throw new InvalidOperationException(); } 
     public override void SetLength(long value) { throw new InvalidOperationException(); } 
     public override long Position 
     { 
      get { throw new InvalidOperationException(); } 
      set { throw new InvalidOperationException(); } 
     } 
    }; 
} 
13

यहाँ System.Diagnostics के लिए एक TextWriter आवरण पर एक त्वरित जाने है डीबग:

class TextWriterDebug : System.IO.TextWriter 
{ 
    public override System.Text.Encoding Encoding 
    { 
     get { return System.Text.Encoding.Default; } 
    } 

    //public override System.IFormatProvider FormatProvider 
    //{ get; } 
    //public override string NewLine 
    //{ get; set; } 

    public override void Close() 
    { 
     System.Diagnostics.Debug.Close(); 
     base.Close(); 
    } 

    protected override void Dispose(bool disposing) 
    { 
     base.Dispose(disposing); 
    } 

    public override void Flush() 
    { 
     System.Diagnostics.Debug.Flush(); 
     base.Flush(); 
    } 

    public override void Write(bool value) 
    { 
     System.Diagnostics.Debug.Write(value); 
    } 

    public override void Write(char value) 
    { 
     System.Diagnostics.Debug.Write(value); 
    } 

    public override void Write(char[] buffer) 
    { 
     System.Diagnostics.Debug.Write(buffer); 
    } 

    public override void Write(decimal value) 
    { 
     System.Diagnostics.Debug.Write(value); 
    } 

    public override void Write(double value) 
    { 
     System.Diagnostics.Debug.Write(value); 
    } 

    public override void Write(float value) 
    { 
     System.Diagnostics.Debug.Write(value); 
    } 

    public override void Write(int value) 
    { 
     System.Diagnostics.Debug.Write(value); 
    } 

    public override void Write(long value) 
    { 
     System.Diagnostics.Debug.Write(value); 
    } 

    public override void Write(object value) 
    { 
     System.Diagnostics.Debug.Write(value); 
    } 

    public override void Write(string value) 
    { 
     System.Diagnostics.Debug.Write(value); 
    } 

    public override void Write(uint value) 
    { 
     System.Diagnostics.Debug.Write(value); 
    } 

    public override void Write(ulong value) 
    { 
     System.Diagnostics.Debug.Write(value); 
    } 

    public override void Write(string format, object arg0) 
    { 
     System.Diagnostics.Debug.Write(string.Format(format, arg0)); 
    } 

    public override void Write(string format, params object[] arg) 
    { 
     System.Diagnostics.Debug.Write(string.Format(format, arg)); 
    } 

    public override void Write(char[] buffer, int index, int count) 
    { 
     string x = new string(buffer, index, count); 
     System.Diagnostics.Debug.Write(x); 
    } 

    public override void Write(string format, object arg0, object arg1) 
    { 
     System.Diagnostics.Debug.Write(string.Format(format, arg0, arg1)); 
    } 

    public override void Write(string format, object arg0, object arg1, object arg2) 
    { 
     System.Diagnostics.Debug.Write(string.Format(format, arg0, arg1, arg2)); 
    } 

    public override void WriteLine() 
    { 
     System.Diagnostics.Debug.WriteLine(string.Empty); 
    } 

    public override void WriteLine(bool value) 
    { 
     System.Diagnostics.Debug.WriteLine(value); 
    } 

    public override void WriteLine(char value) 
    { 
     System.Diagnostics.Debug.WriteLine(value); 
    } 

    public override void WriteLine(char[] buffer) 
    { 
     System.Diagnostics.Debug.WriteLine(buffer); 
    } 

    public override void WriteLine(decimal value) 
    { 
     System.Diagnostics.Debug.WriteLine(value); 
    } 

    public override void WriteLine(double value) 
    { 
     System.Diagnostics.Debug.WriteLine(value); 
    } 

    public override void WriteLine(float value) 
    { 
     System.Diagnostics.Debug.WriteLine(value); 
    } 

    public override void WriteLine(int value) 
    { 
     System.Diagnostics.Debug.WriteLine(value); 
    } 

    public override void WriteLine(long value) 
    { 
     System.Diagnostics.Debug.WriteLine(value); 
    } 

    public override void WriteLine(object value) 
    { 
     System.Diagnostics.Debug.WriteLine(value); 
    } 

    public override void WriteLine(string value) 
    { 
     System.Diagnostics.Debug.WriteLine(value); 
    } 

    public override void WriteLine(uint value) 
    { 
     System.Diagnostics.Debug.WriteLine(value); 
    } 

    public override void WriteLine(ulong value) 
    { 
     System.Diagnostics.Debug.WriteLine(value); 
    } 

    public override void WriteLine(string format, object arg0) 
    { 
     System.Diagnostics.Debug.WriteLine(string.Format(format, arg0)); 
    } 

    public override void WriteLine(string format, params object[] arg) 
    { 
     System.Diagnostics.Debug.WriteLine(string.Format(format, arg)); 
    } 

    public override void WriteLine(char[] buffer, int index, int count) 
    { 
     string x = new string(buffer, index, count); 
     System.Diagnostics.Debug.WriteLine(x); 

    } 

    public override void WriteLine(string format, object arg0, object arg1) 
    { 
     System.Diagnostics.Debug.WriteLine(string.Format(format, arg0, arg1)); 
    } 

    public override void WriteLine(string format, object arg0, object arg1, object arg2) 
    { 
     System.Diagnostics.Debug.WriteLine(string.Format(format, arg0, arg1, arg2)); 
    } 

} // Ends class TextWriterDebug 
+0

क्या आपने मैन्युअल रूप से यह रैपर बनाया था? यदि नहीं, तो कोड को स्वतः उत्पन्न करने के लिए आपने किस टूल का उपयोग किया था? – sammarcow

+0

@ सैमरको मैंने विजुअल स्टूडियो में टेक्स्टवाइटर की मेटा-डेटा जेनरेट की रूपरेखा लेने, इसे काटने और चिपकाने, और वहां से जाने जैसे कुछ किया। 'थोड़ी देर पहले। – WaffleSouffle

+1

यह अच्छा है। विचार करने के लिए एक बिंदु: मुझे यकीन नहीं है कि जब मैं इस टेक्स्टवाइटर को बंद कर दूंगा, तो मैं सभी डीबग ट्रेस श्रोताओं को बंद करना चाहता हूं। – codekaizen

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