Ersatz für __LINE__ und __FILE__ in C#


Thomas Wölfer
Thomas Wölfer

18. März 2005


In C/C++ gibt es für Debugging-Zwecke die praktischen Macros __LINE__ und __FILE__. Die kann man beim ausgeben von Debuginformationen verwenden, um Informationen über die aktuelle Datei und die aktuelle Zeile zu protokollieren. Sowas würde man sich in C# auch wünschen - es gibt diese Macros aber nicht.

Es gibt aber Ersatz, und der kommt in Form der StackFrame Klasse. Damit kann man die gewünschten Informationen ermitteln. Angenommen man möchte eine ErrorReporter Klasse implementieren die eine WriteLine( string message) Methode hat. Diese will man wie folgt aufrufen:

ErrorReporter.WriteLine( "Fehlerbedingung entdeckt.");

WriteLine() soll nun nicht nur die Meldung, sondern eben auch die zugehörige Dateiinformation anzeigen. Das geht dann so:

    public sealed class ErrorReporter
    {
        private ErrorReporter() {}

        [Conditional("DEBUG")]
        public static void WriteLine( string message)
        {
            StackFrame callStack = new StackFrame( 1, true);
            int line = callStack.GetFileLineNumber();
            int col = callStack.GetFileColumnNumber();
            string file = callStack.GetFileName();
            Debug.WriteLine( file + "(" + line + "," + col + "): error: " + message);

        }
    }

Das am ende verwendete Format von Debug.WriteLine() ist übrigens aus einem bestimmten Grund so 'merkwürdig': Die Meldung taucht im Output-Window des Visual Studio auf - und wegen des verwendeten Formates kann man da dann einfach drauf doppelklicken: VS öffnet dann einen Quellcodeeditor an der Stelle, an der der Fehler aufgetreten ist.