2013-04-10 18 views
11

Vom documentation:Was genau ist ContextStaticAttribute?

Ein statisches Feld markiert mit ContextStaticAttribute nicht zwischen Kontexten gemeinsam genutzt wird. Wenn das angegebene statische Feld in einem anderen Kontext als aufgerufen wird, enthält es einen anderen Wert. Verwenden Sie dieses Attribut , wie es ist, und daraus nicht abgeleitet werden.

Das folgende Beispiel zeigt die Syntax dieses Attributs:

[ContextStatic] 
static int f=7; 

es existiert leider nicht geklärt werden, was durch „Kontext“ in diesem Fall gemeint ist. Kann jemand ein Beispiel geben, wann dieses Attribut verwendet wird?

+2

Ich denke, es von .NET Remoting und seine Kontextklassen – Jehof

+0

verwendet wird Siehe [diese Antwort] (http://forums.asp.net/post/2428493.aspx). – Magnus

+0

Die Dokumentation hat einen Link zu ['Context'] (http://msdn.microsoft.com/en-US/library/system.runtime.remoting.contexts.context.aspx):" Sobald ein Objekt platziert wurde ein Kontext, bleibt es für das Leben. Klassen, die an einen Kontext gebunden werden können, werden kontextgebundene Klassen genannt. Wenn auf sie von einem anderen Kontext aus zugegriffen wird, wird auf solche Klassen direkt mit einem Proxy verwiesen. " –

Antwort

4

Das Attribut ist wichtig in einem Fall, in dem Sie Remoting verwenden, wie eine von MarshalByRefObject abgeleitete Klasse. Ihr Code arbeitet dann mit einem Proxy im Client-Programm, einem falschen Klassenobjekt, das genau wie die ursprüngliche Klasse aussieht, dessen Methoden jedoch von der CLR implementiert werden, und die Methodenargumente auf das eigentliche Objekt auf dem Server serialisiert. In der Regel auf einem anderen Computer.

Felder sind ein Problem in einer solchen Klasse, sie können nicht mit einer Ersatzmethode gefälscht werden. Dies ist etwas, mit dem der Jitter umgeht. Wenn es Zugriff auf ein Feld in einem MRBO-Objekt erkennt, generiert es nicht den Code, um das Feld direkt zu lesen/schreiben, es ruft stattdessen eine Hilfsmethode in der CLR auf. Welche weiß, ob das Objekt ein Proxy oder das reale Objekt ist und gibt entweder den Feldwert direkt zurück oder macht stattdessen einen Remoting-Aufruf.

Das fügt natürlich Overhead hinzu, ein Problem mit einem statischen Feld, auf das sehr häufig zugegriffen werden kann. Das [ContextStatic] -Attribut sagt, dass es Ihnen nicht wichtig ist, den tatsächlichen statischen Feldwert zu haben, die lokale Kopie davon ist gut genug. Oder es kann absichtlich verwendet werden, wenn es aus irgendeinem Grund wichtig ist, den Status lokal zu verfolgen. Ich kann mir kein gutes Beispiel dafür vorstellen. Auch die Rahmenprogrammierer wurden nicht innerhalb des Framework-Codes verwendet.

0

Wie bereits in den Kommentaren aus, die Dokumentation in der auch Abschnitt in der Dokumentation von Remoting nicht zeigen Kontexte, die es ein wenig klarer, in welcher Art und Weise macht zu graben.

Die beste Ressource auf dem Thema, das ich mich in der Lage war zu finden, ist http://blogs.msdn.com/b/tilovell/archive/2011/02/07/contextboundobject-part-1-making-contexts.aspx

Kurz gesagt - in 99% der Fälle dieses Attribut ist nicht das, was es auf dem ersten Blick aussehen könnte.