2013-04-10 13 views
11

Dal documentation:Che cos'è esattamente ContextStaticAttribute?

un campo statico contrassegnati con ContextStaticAttribute non è condivisa tra i contesti. Se si accede al campo statico indicato su un contesto diverso , conterrà un valore diverso. Utilizzare questo attributo così com'è e non derivarne.

L'esempio seguente mostra la sintassi di questo attributo:

[ContextStatic] 
static int f=7; 

Purtroppo non chiarisce cosa si intende per "contesto" in questo caso. Qualcuno può dare un esempio per quando questo attributo sarà usato?

+2

Penso che sia utilizzato da .NET Remoting e dalle sue classi Context – Jehof

+0

Vedere [questa risposta] (http://forums.asp.net/post/2428493.aspx). – Magnus

+0

La documentazione ha un collegamento a ['Context'] (http://msdn.microsoft.com/en-US/library/system.runtime.remoting.contexts.context.aspx):" Una volta inserito un oggetto un contesto, rimane in esso per tutta la vita. Le classi che possono essere associate a un contesto sono chiamate classi con contesto. Quando si accede da un altro contesto, tali classi vengono referenziate direttamente utilizzando un proxy. " –

risposta

4

L'attributo è importante nel caso in cui si utilizza il servizio remoto, come una classe derivata da MarshalByRefObject. Il tuo codice funziona quindi con un proxy nel programma client, un oggetto di classe fasullo che assomiglia esattamente alla classe originale ma i cui metodi sono implementati dal CLR e serializzano gli argomenti del metodo sull'oggetto reale che gira sul server. Tipicamente su un'altra macchina.

I campi sono un problema in una classe di questo tipo, non possono essere simulati con un metodo sostitutivo. Questo è qualcosa che affronta il jitter. Quando rileva l'accesso a un campo in un oggetto MRBO, non genera il codice per leggere/scrivere direttamente il campo, ma chiama un metodo di supporto nel CLR. Che sa se l'oggetto è un proxy o l'oggetto reale e restituisce direttamente il valore del campo o effettua invece una chiamata remota.

Questo aggiunge un sovraccarico, naturalmente, un problema con un campo statico a cui è possibile accedere molto frequentemente. L'attributo [ContextStatic] dice che non ti interessa avere il valore del campo statico attuale, la sua copia locale è abbastanza buona. Oppure può essere usato intenzionalmente se per qualche ragione è importante tenere traccia dello stato localmente. Non riesco a pensare a un buon esempio di questo. Né ha fatto i programmatori di framework, non è utilizzato da nessuna parte all'interno del codice framework.