2012-07-07 27 views
8

Zastanawiałem się ...W jakim kontekście używam C#?

Kiedy mam kodu:

lock (obj) 
{ 
    MyCode.MyAgent(); 
} 

MyAgent może zawierać kod, który rozpoznaje jest uruchomiony pod lock bloku?

Co o:

for (int i=0;i<5;i++) 
{ 
    MyCode.MyAgent(); 
} 

MyAgent może zawierać kod, który rozpoznaje jest uruchomiony pod loop bloku?

To samo pytanie można zadać dla using bloków, kod unsafe, etc ... - no masz pomysł ...

Czy jest to możliwe w języku C#?

To tylko teoretyczne pytanie, nie próbuję niczego osiągnąć ... tylko wiedza.

+2

Cóż, myślę, że każde z nich to inne pytanie. Może być coś na 'lock', ale' for' może być zoptymalizowane, a 'using' to po prostu składnia dla' try'/'finally'.Tak czy inaczej, w czasie wykonywania, wiele z nich nie istnieje ... – Kobi

+0

Nie, nigdy nie słyszałem o takich rzeczach i wątpię w te mechanizmy istnieją :) – GETah

+1

Myślę, że każdy programista C# może odpowiedzieć. –

Odpowiedz

8

Nie jest całkowicie niemożliwe, można użyć klasy StackTrace, aby uzyskać odwołanie do metody wywołującej i MethodInfo.GetMethodBody(), aby uzyskać IL tej metody.

Ale nigdy nie otrzymasz tego niezawodnego, optymalizator kompilatora just-in-time da ci bardzo dużo czasu na dokładne ustalenie miejsca połączenia. Metoda inline ciała sprawi, że metoda zniknie całkowicie. Rozwijanie pętli uniemożliwi uzyskanie jakiegokolwiek pojęcia o indeksie pętli. Optymalizator wykorzystuje rejestry procesora do przechowywania zmiennych lokalnych i argumentów metod, co uniemożliwia uzyskanie wiarygodnej wartości zmiennej.

Nie wspominając już o wysiłku żucia w folii cynowej związanym z dekompilacją IL. Nic z tego nie jest nigdzie w pobliżu prostoty i szybkości podawania argumentów do metody.

3

Nie (kod blokujący, który jawnie przekazuje te informacje do metody oczywiście).

Powodem tego jest to, że pojęcia takie jak te nie są przekształcane na uporządkowane informacje, które są zachowane w IL lub metadanych, które CLR może następnie ujawnić użytkownikowi w czasie wykonywania. Porównaj to z klasami, które są zakodowane w metadanych, umożliwiając w ten sposób odbicie w czasie wykonywania.

Próba zachowania tych informacji skutkowałaby zwiększoną złożonością i oczywiście dodatkowym obciążeniem naprawdę nie przyniosłaby żadnych korzyści, ponieważ łatwe jest zaimplementowanie tego w kodzie, jeśli potrzebny jest program do utrzymania takiego stanu (czy jest to dobry pomysł, aby wymagać tego stanu to kolejna kwestia).

0

Nie wierzę, że .NET obsługuje funkcje, które opisujesz bezpośrednio, chociaż możesz uzyskać te informacje za pomocą StackFrame, aby pobrać bieżący stos wywołań i użyć refleksji do analizy treści metod itp., Ale nie jestem pewna, jak precyzyjna mogłabyś być.

. NET ma konteksty do synchronizacji, ale nie na poziomie, o który pytasz. Sprawdź na przykład System.ContextBoundObject.

Powiązane problemy