Hat jemand eine gute Lösung für eine C#-Version des C++ __FUNCTION__ Makros? Der Compiler scheint es nicht zu mögen.
Antworten
Zu viele Anzeigen?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.
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
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..
- See previous answers
- Weitere Antworten anzeigen