variable overload invocar have constructors cannot c# clr static-constructor

overload - static class initializer c#



Usando Static Constructor(Jon Skeet Brainteaser) (5)

Como novato relativo, trato de leer todo lo que puedo sobre un tema en particular y probar / escribir todo el código que pueda. Estaba mirando a uno de los Jons Brainteasers (pregunta # 2) y mi salida fue diferente a la respuesta. Lo que me lleva aquí a preguntarme si algo ha cambiado en las versiones recientes y ver qué resultados obtienen otros de este código.

La pregunta es: "¿Qué se mostrará, por qué y cuánta confianza tiene usted?"

using System; class Foo { static Foo() { Console.WriteLine ("Foo"); } } class Bar { static int i = Init(); static int Init() { Console.WriteLine("Bar"); return 0; } } class Test { static void Main() { Foo f = new Foo(); Bar b = new Bar(); } }

¿Qué, si algo, nos haría obtener dos respuestas diferentes?


Ahora inténtelo en modo de liberación, fuera del depurador ;-p

Obtengo diferentes resultados con / sin un depurador. El depurador altera muchos matices / optimizaciones sutiles, así que solo puedo suponer que este es uno de esos momentos en los que el depurador importa. Lo que hace que sea aún más difícil de depurar ;-p


Creo que se imprimirá foo bar. El constructor de tipo estático se ejecutaría primero en Foo, luego el método Init se llamaría en la clase Bar. Sin embargo, no sé si el comportamiento podría cambiar o no. Esto es interesante.


Imprime Foo, Bar en modo Debug y Bar, Foo en modo Release. Entonces, lo que está sucediendo es que el código de lanzamiento está optimizado y la optimización hace que se llame primero a Bar, pero no hay ninguna garantía de que siempre sea así.


La propia página de respuestas de Jon discute esto. No soy un tipo C #, pero parece que el sistema tiene exactamente una opción de cuándo llamar al código foo estático (y, por lo tanto, escribir "Foo"), pero tiene una libertad infinita para decidir cuándo inicializar Bar.i (que escribirá "Barra"), por lo que puede suceder cuando se carga la clase, o cuando se usa por primera vez, o no se aplica en absoluto.


Solo mirándolo, me sorprendería si se mostrara algo más que "FooBar".

Por la sencilla razón de que estás accediendo a Foo primero, se ejecutará su constructor estático. Seguido por el inicializador de campo estático al crear instancias de Bar.

Feliz de ser corregido.