19 Stimmen

C#-Version des Makros __FUNCTION__

Hat jemand eine gute Lösung für eine C#-Version des C++ __FUNCTION__ Makros? Der Compiler scheint es nicht zu mögen.

26voto

Eoin Campbell Punkte 42038

Versuchen Sie stattdessen dies zu verwenden.

System.Reflection.MethodBase.GetCurrentMethod().Name

C# hat keine __LINE__ o __FUNCTION__ Makros wie C++, aber es gibt Äquivalente

8voto

Mark Booth Punkte 7224

Ich verwende derzeit eine Funktion wie diese:

using System.Diagnostics;

public string __Function() {
    StackTrace stackTrace = new StackTrace();
    return stackTrace.GetFrame(1).GetMethod().Name;
}

Wenn ich __FUNCTION__ benötige, rufe ich stattdessen einfach die __Function() auf. Zum Beispiel:

Debug.Assert(false, __Function() + ": Unhandled option");

Natürlich verwendet auch diese Lösung Reflexion, aber es ist die beste Option, die ich finden konnte. Da ich es nur für Debugging (nicht Tracing in Release-Builds) verwenden die Leistung Hit ist nicht wichtig.

Ich denke, was ich tun sollte, ist Debug-Funktionen erstellen und markieren Sie sie mit

[ Conditional("Debug") ]

stattdessen, aber dazu bin ich noch nicht gekommen.

Dank an Jeff Mastry für seine Lösung dazu.

6voto

JaredPar Punkte 699699

Leider gibt es keine gleichwertige Version dieses Makros in C#. Ich halte die GetCurrentMethodName()-Lösung nicht für gleichwertig mit dem C++-Makro __FUNCTION__. Und zwar deshalb, weil die C++-Version eine Berechnung des Namens zur Kompilierzeit ist. Bei C# ist dies eine Laufzeitberechnung und führt zu Leistungseinbußen.

Ich will keine Vermutungen über die Höhe der Kosten anstellen, aber es gibt eine

5voto

e.James Punkte 112528

Das folgende sollte funktionieren, obwohl es zur Laufzeit und nicht während der Kompilierung ausgewertet wird.

System.Reflection.MethodBase.GetCurrentMethod().Name

3voto

ShloEmi Punkte 1603

Ich benutze dies:

public static string CallerName([CallerMemberName] string callerName = "")
{
    return callerName;
}

Beispiel für die Verwendung:

s_log.DebugFormat("{0}", CallerName());

Der Nachteil ist, dass Sie jedes Mal, wenn Sie den Namen des Aufrufers ausgeben wollen, in die Funktion springen müssen ==> zeitraubend und leistungsmindernd! Ich verwende es also zum Debuggen, und wenn ich es auch im Produktionscode ausgeben muss, füge ich normalerweise den Funktionsnamen in die log.Debug ein, z.B. :

s_log.Debug("CallerName");

HTH..

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X