Quando si crea un'istanza di una classe, tutte le variabili in quell'istanza sono specifiche dell'istanza e vengono eliminate quando l'istanza non è inclusa nell'ambito. Ma come funziona in un metodo statico? Supponiamo che due persone chiamino System.Math.Abs () esattamente alla stessa ora. In che modo il tempo di esecuzione differenzia tra i due chiamanti? È qui che entra in gioco la filettatura? I thread separati vengono creati automaticamente per ogni chiamante?Cosa succede quando si chiama un metodo statico in C#?
risposta
Non esiste alcuna differenza tra i metodi statici e quelli non statici in termini di durata variabile del metodo. In entrambi i casi, come dettaglio di implementazione, i locals sono tipicamente (non proprio sempre: ci sono eccezioni) allocati nello stack. Lo stack è per-thread, quindi le variabili di metodo locali non eseguono il crossover tra i thread.
L'unica differenza qui tra istanza e statica è che i metodi di istanza hanno un parametro zeroth implicita, alias "questo", che viene spinto dal chiamante (più qualche spedizione virtuale e nulla-check divertente).
Per semplicità, io sto passando sopra blocchi iteratore, variabili catturati, ecc
Grazie Marc! – developer747
Tutti i membri statici di una classe esistono anche se non esistono istanze della classe. Vengono inizializzati prima del primo utilizzo e vengono ripuliti quando il programma è completo.
Se due chiamate simultanee a un metodo statico, avrebbero funzionato con la stessa copia di tutti i membri statici della classe (se li utilizzano). Quindi, se il metodo statico funziona su un membro statico (o parametro), dovrebbe farlo in modo thread-safe. Se il metodo statico funziona solo sui locali, il metodo stesso è in genere thread-safe.
Per quanto riguarda il modo in cui il runtime distingue tra due chiamanti, questa è l'essenza del threading. Ogni thread ha il proprio stack di chiamate con la propria copia di eventuali variabili locali, parametri, indirizzo di ritorno, ecc. Quindi le due chiamate non vengono confuse e ciascuna restituisce correttamente il proprio chiamante. L'unica preoccupazione, ancora una volta, è se il metodo statico funziona su un membro statico che non è thread-safe (o un parametro che non è thread-safe).
Buona spiegazione James. Grazie. Come fanno le persone a sapere cosa mi hai appena detto? Potresti raccomandare qualche buon libro, che affronta i fondamentali come questo? – developer747
La maggior parte di questo ho imparato solo da il mio BS in corsi CompSci sulla programmazione della teoria del linguaggio e dallo studio autonomo dei linguaggi di programmazione.Se vuoi davvero entrare nei dettagli, leggi la specifica del linguaggio C#, ti dirà praticamente tutto ciò che c'è da sapere sull'implementazione: http: //msdn.microsoft.com/en-us/library/ms228593.aspx –
Se dovessi raccomandare uno dei libri del tuo undergrad (che affronta aspetti fondamentali come questo) quale sarebbe? – developer747
Quando si crea un'istanza di una classe, tutte le variabili specifiche a tale istanza vengono uccisi quando l'istanza è fuori scopo.
Le variabili - di solito chiamati "campi" vengono deallocate dopo il vita dell'istanza. Scope è l'area del testo del programma in cui il compilatore riconosce qualcosa con il suo nome; liftime è la porzione di tempo durante cui un percorso di archiviazione è valido. Portata e durata sono spesso confusi.
Ma come funziona in un metodo statico?
I campi statici hanno una durata illimitata; il percorso di archiviazione viene creato in qualsiasi momento prima dell'accesso al campo e non viene eliminato fino a quando il dominio dell'app non viene rimosso.
Supponiamo che due persone chiamino System.Math.Abs () esattamente alla stessa ora.
OK. Come proponi che ciò accada?
Come differenzia il tempo di esecuzione tra i due chiamanti? È qui che entra in gioco la filettatura?
Il metodo statico viene inserito in un gruppo di istruzioni della macchina che sono numeri in memoria. Ad ogni thread di esecuzione è associato un numero chiamato puntatore di istruzioni che individua l'istruzione corrente. Due thread diversi possono entrambi avere puntatori di istruzioni che si trovano nello stesso metodo statico nello stesso momento.
I thread separati vengono creati automaticamente per ogni chiamante?
La domanda non ha alcun senso. Come hai ottenuto due chiamanti allo stesso tempo se non erano già in thread separati?
- 1. In C#, cosa succede quando si chiama un metodo di estensione su un oggetto nullo?
- 2. Cosa succede veramente quando si chiama setCancelsTouchesInView?
- 3. Cosa succede quando si chiama `if digit in dict`
- 4. Come si chiama un metodo non statico da un metodo statico in C#?
- 5. Comprendere le transazioni Spring - Cosa succede quando un metodo transazionale chiama un altro metodo transazionale?
- 6. Cosa succede quando si chiama Malloc su una variabile esistente?
- 7. Cosa succede alla memoria allocata dinamica quando si chiama execv()?
- 8. Cosa succede agli altri thread quando un thread si biforca()?
- 9. Cosa succede nel linguaggio assembly quando chiamate un metodo/funzione?
- 10. Cosa succede se non si chiama mai Socket.EndConnect?
- 11. C#: come si chiama un metodo statico di una classe base da un metodo statico di una classe derivata?
- 12. Cosa significa "DisplayClass" quando si chiama lambda?
- 13. Chiama un metodo membro non statico da un altro metodo
- 14. Come si passano i parametri per riferimento quando si chiama un metodo statico utilizzando la riflessione?
- 15. Che cos'è un "metodo statico" in C#?
- 16. Cosa succede quando carico un assieme?
- 17. Cosa succede esattamente quando si salva un modello Backbone?
- 18. Cosa succede quando si modifica direttamente Gemfile.lock?
- 19. Cosa succede quando si esegue ng serve?
- 20. cosa succede quando si verificano due eccezioni?
- 21. Cosa succede quando lancio un'eccezione C++ da un metodo Java nativo?
- 22. Cosa succede quando si usa make_shared
- 23. Come chiamare un metodo statico in C#
- 24. cosa succede esattamente quando `enableProdMode()`
- 25. Come si chiama quando si esegue l'override di un metodo mentre si chiama un costruttore?
- 26. Un'istanza di una classe creata automaticamente quando si chiama per la prima volta un metodo statico
- 27. Cosa succede quando si converte double (o float) in ints?
- 28. cosa succede quando si digita un URL nel browser
- 29. cosa succede veramente quando si passano oggetti in java?
- 30. C++ 11: Cosa succede se non si chiama join() per std :: filo
Does [this] (http://stackoverflow.com/questions/680546/static-function-concurrency-asp-net) risponde alla tua domanda? –
.ToString non è un metodo statico. –
Emmanuel, ho controllato il post che hai menzionato. Riguarda la mia preoccupazione, ma non posso rispondere :( – developer747