Cuando crea una instancia de una clase, todas las variables en esa instancia son específicas de esa instancia y mueren cuando la instancia está fuera del alcance. Pero, ¿cómo funciona en un método estático? Supongamos que dos personas llaman a System.Math.Abs () exactamente al mismo tiempo. ¿Cómo se diferencia el tiempo de ejecución entre las dos personas que llaman? ¿Es aquí donde entra la rosca? ¿Se crean automáticamente hilos separados para cada persona que llama?¿Qué sucede cuando llamas a un método estático en C#?
Respuesta
No existe una diferencia real entre los métodos estáticos y no estáticos en términos de duración de la variable de método. En ambos casos, como un detalle de implementación, los locales son típicamente (no del todo: hay excepciones) asignados en la pila. La pila es por subproceso, por lo que las variables de método locales no se cruzan entre subprocesos.
La única diferencia aquí entre instancia y estática es que los métodos de instancia tienen un parámetro de orden cero implícita, también conocido como "presente", que es empujado por la persona que llama (además de algunos de despacho virtual y divertido nula-check).
Por simplicidad, estoy pasando por alto los bloques de iterador, variables capturadas, etc.
Gracias Marc! – developer747
Todos los miembros estáticos de una clase existen aunque no existan instancias de la clase. Se inicializan en algún momento antes del primer uso y se limpian cuando se completa el programa.
Si tenía dos llamadas simultáneas a un método estático, estarían trabajando con la misma copia de los miembros estáticos de la clase (si los usan). Por lo tanto, si el método estático opera en un miembro estático (o parámetro), debe hacerlo de una manera segura. Si el método estático solo funciona en locales, entonces el método en sí mismo es típicamente seguro para subprocesos.
En cuanto a cómo diferencia el tiempo de ejecución entre dos llamadas, esta es la esencia del enhebrado. Cada hilo tiene su propia pila de llamadas con su propia copia de cualquier variable local, parámetros, dirección de retorno, etc. Por lo tanto, las dos llamadas no se confunden y cada una regresa a su llamador correctamente. La única preocupación, nuevamente, es si el método estático opera en un miembro estático que no es seguro para subprocesos (o un parámetro que no es seguro para subprocesos).
Buena explicación James. Gracias. ¿Cómo sabe la gente lo que me acaba de decir? ¿Podría recomendar algún buen libro que aborde los fundamentos de este tipo? – developer747
La mayoría de esto lo aprendí solo de mi licenciatura en cursos de CompSci sobre teoría del lenguaje de programación y autoaprendizaje de lenguajes de programación. Si realmente quiere profundizar en los detalles, lea la Especificación del lenguaje C#, le dirá todo lo que hay que saber sobre la implementación: http: //msdn.microsoft.com/en-us/library/ms228593.aspx –
Si tuviera que recomendar uno de los libros de su licenciatura (que se refiere a fundamentos como este) ¿qué sería? – developer747
Cuando se crea una instancia de una clase, todas las variables específicas a esa instancia son asesinados cuando la instancia está fuera de alcance.
Las variables - usualmente llamados "campos" se cancela la asignación después de la vida de la instancia. El ámbito es la región del texto del programa en la que el compilador reconoce algo por su nombre; liftime es la parte del tiempo durante el cual una ubicación de almacenamiento es válida. El alcance y el tiempo de vida a menudo se confunden.
Pero, ¿cómo funciona en un método estático?
Los campos estáticos tienen vidas ilimitadas; la ubicación de almacenamiento se crea en algún momento antes de que se acceda al campo y no se destruya hasta que se rompa el dominio de aplicación.
Supongamos que dos personas llaman a System.Math.Abs () exactamente al mismo tiempo.
OK. ¿Cómo propones que eso suceda?
¿Cómo diferencia el tiempo de ejecución entre las dos personas que llaman? ¿Es aquí donde entra la rosca?
El método estático se inserta en un conjunto de instrucciones de la máquina que son números en la memoria. Cada hilo de ejecución tiene un número asociado llamado puntero de instrucción que ubica la instrucción actual. Dos subprocesos diferentes pueden tener punteros de instrucción que están dentro del mismo método estático al mismo tiempo.
¿Se crean automáticamente hilos separados para cada llamante?
La pregunta no tiene ningún sentido. ¿Cómo obtuviste dos llamadas al mismo tiempo si no estaban ya en hilos separados?
- 1. ¿Qué sucede si nunca llamas a Socket.EndConnect?
- 2. ¿Qué es un "método estático" en C#?
- 3. ¿Qué sucede cuando se invoca un método estático usando una referencia de objeto nulo?
- 4. ¿Por qué un delegado no puede hacer referencia a un método no estático cuando se usa en un método estático?
- 5. Llamar a un método estático en C#
- 6. Python: ¿Cómo llamas a un método cuando solo tienes el nombre de la cadena del método?
- 7. ¿Cómo puedo llamar a un método no estático desde un método estático en C#?
- 8. ¿Qué sucede cuando paso argumentos a un símbolo de Clojure?
- 9. ¿Qué sucede cuando compilo?
- 10. ¿Qué le sucede a un objeto NSArray cuando se codifica?
- 11. @synchronized en un método estático
- 12. ¿Cómo acceder a un método estático en C#?
- 13. ¿Qué sucede cuando lanzo una excepción de C++ desde un método nativo de Java?
- 14. ¿Qué hace sincronizado en un método estático?
- 15. ¿Qué sucede cuando un proceso se bifurca?
- 16. ¿Qué sucede cuando cargo un ensamblaje?
- 17. ¿Qué sucede cuando ejecuta un programa?
- 18. C#: ¿Qué ocurre si se llama a un método estático desde varios subprocesos?
- 19. ¿Qué sucede cuando edito web.config?
- 20. ¿Podemos tener un método estático virtual? (C++)
- 21. Qué sucede en IIS/C# cuando se cancela una solicitud
- 22. ¿Por qué el '{' arroja una NullReferenceException en un método estático?
- 23. ¿Qué sucede realmente cuando haces GetType()?
- 24. ¿Qué sucede si llamas al mismo repetidor dos veces en la misma colección?
- 25. ¿Qué sucede cuando no es lógico un flotador?
- 26. Anular un método estático
- 27. ¿Qué sucede cuando un hilo arroja una excepción?
- 28. ¿Qué sucede cuando la referencia C++ deja su alcance?
- 29. En Java, ¿qué sucede cuando tienes un método con una palabra clave de visibilidad no especificada?
- 30. ¿Qué sucede cuando cierra una aplicación de consola de C++?
¿[este] (http://stackoverflow.com/questions/680546/static-function-concurrency-asp-net) responde a su pregunta? –
.ToString no es un método estático. –
Emmanuel, revisé la publicación que mencionaste. Se dirige a mi preocupación, pero no la respondo :( – developer747