2012-02-17 10 views
12

Non credo che il codice generato controllerebbe se la classe è stata inizializzata ogni volta che accede a un membro statico (che include funzioni). Credo che controllare ogni accesso sarebbe inefficiente. Ho guardato §17.11 in ECMA 334 e si diceCome fa C# a sapere quando eseguire un costruttore statico?

L'esecuzione di un costruttore statico viene attivato dal primo dei seguenti eventi che si verificano all'interno di un dominio di applicazione:

  • Un'istanza della la classe è stata creata.
  • Viene fatto riferimento a qualsiasi membro statico della classe.

si presenta Come capire quando 'prima' che accade non è definito. Non riesco a pensare a un modo per farlo, ma per controllare ogni volta. Come potrebbe essere fatto?

+3

Correlato, per il caso statico: http://csharpindepth.com/Articles/General/Beforefieldinit.aspx - non è banale –

+0

Non è la questione di impostare un puntatore a funzione in un percorso diverso dopo il primo chiamata? All'inizio punta al caricatore di classe o altro, quindi al corpo della funzione ... – user1096188

+1

@Marc: discute quando si chiama il costruttore statico PRIMA il primo accesso a un membro statico è consentito, non come viene rilevato il primo accesso . –

risposta

5

Quando si genera codice in fase di esecuzione, sono disponibili numerose opzioni. È possibile chiamare un puntatore a funzione NULL, rilevare la violazione di accesso, eseguire il costruttore statico, compilare il getter della proprietà, aggiornare il puntatore della funzione e continuare. Oppure chiedi al getter della proprietà di chiamare una funzione helper che esegue il costruttore statico e riscrive il codice getter senza la chiamata della funzione helper. O inserire un controllo su ogni accesso membro statico, che quando viene colpito ricompila la funzione di chiamata con il controllo rimosso.

16

Quando hai un problema da risolvere, una buona tecnica è: risolvere un problema ancora più difficile, in modo che la soluzione del tuo piccolo problema sia risolta dalla soluzione del problema più difficile.

Il CLR ha un problema molto più difficile da risolvere: deve eseguire il jitter esattamente una volta su ogni metodo prima che il metodo venga chiamato per la prima volta. Se il CLR può risolvere questo problema, allora può ovviamente risolvere il sottotesto comparativamente triviale di rilevare quando un ctor statico deve essere eseguito.

Forse la tua domanda dovrebbe essere "come fa il jitter a sapere quando lanciare un metodo per la prima volta?"

+0

Interessante. Ho appena dato per scontato che il JIT sui sistemi non embedded stia semplicemente facendo jitter di tutto e stia pronto a caricare nuove DLL. Ho ipotizzato che i sistemi di inclusione usassero la complicazione in anticipo. Cattiva presunzione, specialmente quando entra in gioco un codice di grandi dimensioni. +1 per i pensieri –

+1

@ acidzombie24 in realtà, alcuni sistemi embedded non fanno JIT/AOT ** affatto ** - Micro Framework è un interprete IL (incrocia le dita che non ho questo indietro ...) –

+0

e alcuni sistemi come.Net Compact Framework JIT solo elementi di base, ad es. ottenere proprietà è una funzione chiamata –

Problemi correlati