Aquí solo hizo una pregunta, pero hay una docena de preguntas que debería haber hecho, así que las responderé todas.
Aquí está la secuencia que asumí
- Inicio del constructor de clase (también conocido como
cctor
)
- Fin de cctor
- inicio de Main
- inicio de MyMethod
¿Es esto correcto?
No. La secuencia correcta es:
- Inicio del cctor para el programa, si lo hay. No hay.
- Fin de cctor para el programa, si hay uno. No hay.
- Inicio de Main
- Inicio de cctor para MyClass
- Fin de cctor para MyClass
- Inicio de MyClass.MyMethod
¿Qué pasa si hay un inicializador de campo estático?
El CLR puede cambiar el orden en el que se ejecutan los inicializadores de campo estático en algunos casos. Vea la página de Jon sobre el tema para más detalles:
Las diferencias entre constructores estáticos e inicializadores de tipo
¿Es posible alguna vez MyMethod
llamar a un método estático como antes de que se complete el cctor de esa clase?
Si. Si el propio cctor llama a MyMethod, obviamente se llamará a MyMethod antes de que se complete el cctor.
El cctor no llama a MyMethod. ¿Es posible MyMethod
que se llame a un método estático como antes de que se complete el cctor de MyClass?
Si. Si el cctor usa otro tipo cuyo cctor llama a MyMethod, entonces se llamará a MyMethod antes de que se complete el cctor MyClass.
¡Ningún actor llama a MyMethod, directa o indirectamente! Ahora bien, ¿alguna vez es posible MyMethod
que se llame a un método estático como antes de que se complete el cctor de MyClass?
No.
¿Sigue siendo cierto incluso si hay varios hilos involucrados?
Si. El cctor terminará en un hilo antes de que se pueda llamar al método estático en cualquier hilo.
¿Se puede llamar al cctor más de una vez? Suponga que dos subprocesos hacen que se ejecute el cctor.
Se garantiza que el cctor se llamará como máximo una vez, sin importar cuántos subprocesos estén involucrados. Si dos hilos llaman a MyMethod "al mismo tiempo", corren. Uno de ellos pierde la carrera y bloquea hasta que el cctor MyClass completa el hilo ganador.
¿El hilo perdedor se bloquea hasta que termina el ciclo? ¿ De verdad ?
De Verdad.
Entonces, ¿qué pasa si el cctor en el hilo ganador llama al código que bloquea en un bloqueo tomado previamente por el hilo perdedor ?
Entonces tienes una condición clásica de inversión de orden de bloqueo. Su programa se bloquea. Siempre.
Eso parece peligroso. ¿Cómo puedo evitar el estancamiento?
Si te duele cuando haces eso, deja de hacerlo . Nunca hagas algo que pueda bloquear un cctor.
¿Es una buena idea confiar en la semántica de inicialización de cctor para hacer cumplir los requisitos de seguridad complejos? ¿Y es una buena idea tener un actor que interactúe con los usuarios?
Tampoco lo son las buenas ideas. Mi consejo es que debe encontrar una manera diferente de asegurarse de que se cumplan las condiciones previas de sus métodos que afectan la seguridad.