Cuando tengo una clase que contiene un constructor estático, ¿se llama a ese constructor cuando se carga por primera vez el ensamblaje que contiene la clase o cuando se golpea la primera referencia a esa clase?¿Cuándo se llama un constructor estático en C#?
Respuesta
Cuando se accede a la clase por primera vez.
Static Constructors (C# Programming Guide)
Un constructor estático se utiliza para inicializar los datos estáticos, o para realizar una acción particular que debe realizarse una vez solamente. Se llama automáticamente antes de que se cree la primera instancia o se hace referencia a cualquier miembro estático.
No es tan simple como cabría esperar a pesar de la documentación directa. El artículo de Jon Skeet http://csharpindepth.com/Articles/General/Beforefieldinit.aspx entra en esta cuestión en detalles.
Resumen:
constructor estático está garantizada para ser ejecutado inmediatamente antes de la primera referencia a un miembro de esa clase - ya sea creación de instancia o propio método/propiedad estática de la clase.
Tenga en cuenta que initilaizers estáticos (si no hay un constructor estático) garantizada para ser ejecutado en cualquier momento antes de la primera referencia al campo en particular.
+1. Muéstremelo, solo que sin embargo. ;) – AnthonyWJones
Es una lectura muy interesante, gracias caballeros. – Jason
El artículo mencionado se encuentra ahora en el sitio de Jon Skeet: http://csharpindepth.com/Articles/General/Beforefieldinit.aspx – dotnetguy
Se llama al constructor estático antes de usar algo en la clase, pero exactamente cuando eso sucede depende de la implementación.
Se garantiza que se llamará antes de acceder al primer miembro estático y antes de que se cree la primera instancia. Si nunca se utiliza la clase, no se garantiza que se invoque el constructor estático.
Cuando sucede * no es * "hasta la implementación" si esa implementación sigue la especificación ECMA C#: "La ejecución de un constructor estático se desencadena por el primero de los siguientes eventos que ocurren dentro de un dominio de aplicación: [1] se crea la instancia de la clase. [2] Se hace referencia a cualquiera de los miembros estáticos de la clase ". (Sección 17.11, http://www.ecma-international.org/publications/standards/Ecma-334.htm) – LukeH
@Luke: "El momento exacto de la ejecución del constructor estático depende de la implementación" http://ondotnet.com/pub/a/dotnet/2003/07/07/staticxtor.html – Guffa
@Guffa: Esa podría ser la interpretación del autor del artículo, pero no encontrará esa redacción en las versiones de Microsoft o ECMA/ISO de la especificación C#. – LukeH
En caso de que se llame al método estático de la clase padre, no se llamará al constructor estático, aunque esté explícitamente especificado. Aquí hay un ejemplo b No se llama al constructor si se llama a b.methoda().
static void Main(string[] args)
{
b.methoda();
}
class a
{
public static void methoda()
{
//using initialized method data
}
}
class b : a
{
static b()
{
//some initialization
}
}
- 1. ¿Cuándo se llama exactamente el constructor del objeto local estático?
- 2. ¿Cuándo se llama al constructor?
- 3. ¿Cuándo se llama al Constructor en Java?
- 4. ¿Cómo sabe C# cuándo ejecutar un constructor estático?
- 5. ¿Cuándo se llama un destructor de C++?
- 6. constructor estático en C#
- 7. C# Genérico estático Constructor
- 8. Constructor estático en VB.NET
- 9. Eliminar, ¿cuándo se llama?
- 10. View.onDraw() --- ¿cuándo se llama?
- 11. equivalente constructor estático en Objective-C?
- 12. ¿Cuándo se llama un cuerpo onLoad?
- 13. Condición de carrera en C# constructor estático
- 14. constructor público y constructor estático
- 15. ¿Hay un constructor estático o un inicializador estático en Python?
- 16. Constructor de bases en C# - ¿A quién se llama primero?
- 17. En una clase PHP5, ¿cuándo se llama a un constructor privado?
- 18. ¿Cuándo se llama a 'drawRect'?
- 19. ¿Cuándo se llama a viewDidLoad?
- 20. ¿Cuándo se llama a ServiceConnection.onServiceDisconnected()?
- 21. ¿Constructor estático se llama dos veces en el mismo dominio de aplicación?
- 22. Cuándo se llama a destructor en un servicio WCF
- 23. ¿Cuándo se llama a initWithCoder?
- 24. ¿Cuándo se llama a didRegisterForRemoteNotificationsWithDeviceToken?
- 25. Excepción en el constructor estático
- 26. ¿Cuándo se llama a OnValidate en Linq?
- 27. ¿Por qué mi sobrecargado constructor de C++ no se llama?
- 28. C++ ¿Se llama aquí al constructor de copia?
- 29. ¿Siempre se llama al constructor predeterminado de C++, como se indica en C++ Primer?
- 30. variables de clase objetivo-c: ¿cuándo se llama a dealloc?
Gracias, eso tiene sentido cuando pienso en ello correctamente! – Jason
Es interesante que dice "antes de crear la primera instancia o se hace referencia a cualquier miembro estático". Hay un margen de acción allí en * cuando * en realidad se invoca. –
@TimBarrass debido a algunos otros requisitos de especificación resulta que "antes" es en realidad "inmediatamente anterior" - ver el artículo de Jon Skeet mencionado en otra respuesta - http://stackoverflow.com/a/1437372/477420 –