2013-04-19 10 views
24

Próbuję znaleźć sposób na rejestrację nazwy metody w efektywny sposób w.r.t. szybkość i łatwość konserwacji. Myślę, że w .Net 4.5 Caller Information attributes są narażone tylko w tym celu, z wyjątkiem części prędkości. Czuję, że są to tylko syntaktyczne cukry z użycia System.Reflection.MethodBase.GetCurrentMethod() lub stackTrace.GetFrame (1) .GetMethod(). Nazwa (otrzymana od here). (lub) Czy te metody zapewniają również korzyści w zakresie wydajności?Osiągnięte wyniki za pomocą atrybutów informacji o dzwoniącym

W języku C#, czy istnieje sposób na uzyskanie nazwy metody w czasie kompilacji (jak w przypadku c++)?

+4

Czy rzeczywiście profilowane ich wydajności, lub są po prostu przesądzając problem, który nie może być problemem? –

+0

@DanielKelley Nie zmierzyłem wydajności. Chciałem wiedzieć, co dzieje się pod osłonami atrybutów informacji o dzwoniącym. Daniel wspomniał, że wymiana następuje w czasie kompilacji, którego dokładnie szukam. – Imran

Odpowiedz

51

Atrybuty informacji o dzwoniącym powodują, że kompilator C# podaje nazwę dzwoniącego w miejscu połączenia. Dzieje się to podczas kompilacji, nie ma w tym nic wspólnego.

public void DoProcessing() 
{ 
    LogCall(); 
} 

public void LogCall([CallerMemberName] string memberName = "") 
{ 
    Console.WriteLine(memberName + " was called."); 
} 

zostaną skompilowane do:

public void DoProcessing() 
{ 
    LogCall("DoProcessing"); 
} 

public void LogCall(string memberName) 
{ 
    Console.WriteLine(memberName + " was called."); 
} 
+0

To jest dokładnie to, czego szukam. Dziękuję za szybką odpowiedź. Czy masz jakiś pomysł na osiągnięcie wymiany czasu kompilacji w starszych wersjach .NET? – Imran

+1

[CallerMemberInfo] będzie działał z każdą wersją .NET, o ile używasz kompilatora C# 5. Zobacz http://stackoverflow.com/questions/13381917/is-the-callermembername-attribute-in-4-5-able-to-be-faked – Daniel

+0

Dzięki za link. Obecnie nie używam kompilatora C# 5, który wymaga VS2012. – Imran

Powiązane problemy