Soru System.Diagnostics.Debug sınıfına bir TextWriter arabirimi var mı?


Genellikle System.Diagnostics.Debug.Write / WriteLine yöntemleri tarafından hayal kırıklığına uğradım. TextWriter sınıfından tanıdık olan Write / WriteLine yöntemlerini kullanmak istiyorum, bu yüzden sık sık yazarım.

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

Bir derleyici hatası neden olur. Yazmayı bitirdim

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

Bu gerçekten garip.

CLR, System.Debug'ı "sarar" yazan TextWriter'den türeyen bir sınıfa sahip mi yoksa kendi başımı mı döndürmeli?


25
2018-05-06 08:54


Menşei




Cevaplar:


Özellikle bütününe ihtiyacın var mı TextWriter? Bu biraz "hızlı ve kirli" iken, sadece birkaç yöntemle statik bir sınıftan şüphelendim:

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

Veya benzeri.

Dikkat et, kişisel olarak çıkış üzerinde daha fazla kontrol sağlamak için log4net gibi bir şeye bakarım.


8
2018-05-06 08:57





İşlev Debug.Print biçimlendirme ve argümanlar kullanmanıza izin verir.

[Düzenle:]

Eğer kullanmayı tercih ederseniz TextWriter Arabirim, aşağıdakileri kullanabilirsiniz:

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(); }
        }
    };
}

32
2017-11-20 17:44





İşte System.Diagnostics.Debug için bir TextWriter sarıcısına hızlıca gidin:

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 

14
2018-01-13 18:22



Bu sarıcı el ile mi oluşturdunuz? Eğer değilse, kodu otomatik olarak oluşturmak için hangi aracı kullandınız? - sammarcow
@sammarcow Visual Studio'da TextWriter'in oluşturduğu meta-data taslağını alarak, kesip yapıştırarak ve oradan giderken bir şey yaptım. Bir süre önce Twas. - WaffleSouffle
Bu güzel. Dikkate alınması gereken bir nokta: Bu TextWriter kapalıyken, tüm Debug izleme dinleyicilerini kapatmak istediğimden emin değilim. - codekaizen