lei ha chiesto solo una domanda qui, ma ci sono una dozzina di domande che si dovrebbe hanno chiesto, quindi mi limiterò a tutti rispondono.
Ecco la sequenza che ho assunto
- Inizio del costruttore di classe (anche conosciuto come
cctor
)
- Fine cctor
- inizio principale
- inizio MyMethod
È corretto?
No. La sequenza corretta è:
- Inizio cctor per il programma, se ce n'è uno. Non c'è.
- Fine del cctor per Programma, se ce n'è uno. Non c'è.
- Inizio di Main
- Inizio cctor per MyClass
- Fine cctor per MyClass
- Inizio MyClass.MyMethod
Che cosa succede se c'è un campo inizializzatore statico?
Il CLR è autorizzato a modificare l'ordine di esecuzione degli inizializzatori del campo statico in alcuni casi. Vedere pagina di Jon sul tema per i dettagli:
The differences between static constructors and type initializers
E 'mai possibile che un metodo statico come MyMethod
di essere chiamato prima della cctor di quella classe completa?
Sì.Se il cctor stesso chiama MyMethod, ovviamente MyMethod verrà chiamato prima del completamento del cctor.
Il cctor non chiama MyMethod. È mai possibile chiamare un metodo statico come MyMethod
prima che il cctor di MyClass sia completato?
Sì. Se il cctor utilizza un altro tipo il cui cctor chiama MyMethod, MyMethod verrà chiamato prima del completamento del cctor MyClass.
Nessun cctor chiama MyMethod, direttamente o indirettamente! È mai possibile che un metodo statico come MyMethod
venga chiamato prima del completamento del cctor di MyClass?
No.
E 'ancora vero anche se ci sono più thread coinvolti?
Sì. Il cctor finirà su un thread prima che il metodo statico possa essere chiamato su qualsiasi thread.
Il cctor può essere chiamato più di una volta? Supponiamo che due thread causino l'esecuzione del cctor.
Il cctor è garantito per essere chiamato al massimo una volta, indipendentemente dal numero di thread coinvolti. Se due thread chiamano MyMethod "allo stesso tempo", allora corrono. Uno di loro perde la gara e blocca fino a quando il cctor MyClass non completa il thread vincente.
Il filo perdente blocchi fino a quando il cctor è fatto? Davvero?
Davvero.
Che importa se il cctor sul filo vincente chiama il codice che blocca su un blocco precedentemente adottate dal perdendo filo?
Quindi si dispone di una classica condizione di inversione dell'ordine di blocco. Il tuo programma si blocca. Per sempre.
Sembra pericoloso. Come posso evitare lo stallo?
Se fa male quando lo fai allora smettere di farlo. Non fare mai qualcosa che può bloccare in un cctor.
È consigliabile fare affidamento sulla semantica di inizializzazione di cctor per imporre requisiti di sicurezza complessi? Ed è una buona idea avere un cctor che faccia interazioni con l'utente?
Né sono buone idee. Il mio consiglio è che dovresti trovare un modo diverso per garantire che vengano soddisfatte le precondizioni che influenzano la sicurezza dei tuoi metodi.
Questa è una domanda java o C#? Hai inserito entrambi i tag e non penso che le specifiche siano le stesse nelle due lingue. – ARRG
Nella mia apertura questo è lo stesso per entrambi .. Ma io sono C# guy .. Sry per quello – om471987
Java non ha un costruttore statico allo stesso modo, solo blocchi statici per l'inizializzazione statica. static {// do something ...} – deraj