In welchem ​​Kontext laufe ich in C #?

8

Ich habe mich gefragt ...

Wenn ich einen Code wie diesen habe:

%Vor%

Kann MyAgent Code enthalten, der erkennt er läuft unter einem lock Block?

Was ist mit:

%Vor%

Kann MyAgent Code enthalten, der erkennt er läuft unter einem loop Block?

Die gleiche Frage kann für using blocks, unsafe code, etc ... gestellt werden - nun, Sie haben die Idee ...

Ist das in C # möglich?

Das ist nur eine theoretische Frage, ich versuche nichts zu erreichen ... nur Wissen.

    
Royi Namir 07.07.2012, 12:15
quelle

3 Antworten

8

Es ist nicht vollständig unmöglich, Sie können die StackTrace-Klasse verwenden, um einen Verweis auf die Methode des Aufrufers und MethodInfo.GetMethodBody () zu erhalten, um die IL dieser Methode zu erhalten.

Aber Sie werden nie so zuverlässig sein, der Optimierer des Just-in-Time-Compilers wird Ihnen sehr schwer dabei helfen, genau herauszufinden, wo sich der Anruf befindet. Mit der Methode body inlining wird die Methode vollständig ausgeblendet. Das Abrollen der Schleife macht es unmöglich, eine Vorstellung vom Schleifenindex zu bekommen. Der Optimierer verwendet CPU-Register, um lokale Variablen und Methodenargumente zu speichern, was es unmöglich macht, einen zuverlässigen Variablenwert zu erhalten.

Ganz zu schweigen von der bei der Dekompilierung von IL involvierten Blechfolie. Nichts davon ist annähernd so einfach und schnell, als dass man nur ein Argument an die Methode weitergibt.

    
Hans Passant 07.07.2012, 12:40
quelle
3

Nein (Sperrcode, der diese Information explizit an die Methode weiterleitet).

Der Grund dafür ist, dass Konzepte wie diese nicht in strukturierte Informationen übersetzt werden, die entweder in IL oder in Metadaten erhalten bleiben, die Ihnen die CLR dann zur Laufzeit zur Verfügung stellen könnte. Vergleichen Sie dies mit Klassen, die in Metadaten kodiert werden und so die Reflektion zur Laufzeit ermöglichen.

Der Versuch, diese Informationen beizubehalten, würde zu einer erhöhten Komplexität und natürlich zu einem zusätzlichen Overhead führen, da dies im Code einfach implementiert werden kann, wenn Ihr Programm diesen Zustand beibehalten soll (ob es eine gute Idee ist, diesen Status zu verlangen) ein anderes Problem).

    
Jon 07.07.2012 12:38
quelle
0

Ich glaube nicht, dass .NET die von Ihnen beschriebenen Funktionen direkt unterstützt, obwohl Sie diese Informationen möglicherweise mit StackFrame abrufen können, um den aktuellen Aufruf-Stack zu erfassen und Reflektionen zu verwenden, um Methodenverkörperungen usw. zu analysieren. Ich bin mir nicht sicher, wie genau du jemals sein könntest.

.NET hat Kontexte für die Synchronisation, aber nicht auf der Ebene, nach der Sie fragen. Sehen Sie sich zum Beispiel System.ContextBoundObject an.

    
Ergwun 07.07.2012 12:43
quelle

Tags und Links