2011-07-18 27 views
5

En C# 4, se modificó el comportamiento de los tipos sin el indicador beforefieldinit, por lo que ahora un inicializador de tipo puede llamar antes del primer uso de cualquier campo estático de la clase.¿Por qué el comportamiento BeforeFieldInit cambia en .NET 4?

¿Por qué el equipo C# /. NET ha cambiado ese comportamiento? ¿Cuál es el motivo principal? ¿Puedes mostrar algún ejemplo práctico donde este cambio tenga algún sentido?

+0

¿Referencia? ¿Dónde leíste esto? – leppie

+1

Lo leí aquí: [enlace] (http://msmvps.com/blogs/jon_skeet/archive/2010/01/26/type-initialization-changes-in-net-4-0.aspx) Y en mi opinión la razón principal es el rendimiento de los métodos de extensión? ¿Qué piensas? –

+1

irrelevante. Estas cosas no están documentadas por una razón. –

Respuesta

11

El comportamiento ha sido siempre dentro de los límites de lo que es documentado - es sólo que pasó de ser ansioso por pereza en .NET 4.

I sospechoso el equipo JIT conseguido encontrar una manera de hágalo perezoso sin una penalización de rendimiento ... o posiblemente ayude al rendimiento en otro lugar. Es probable que solo sea uno tal cambio en el comportamiento dentro de .NET 4 CLR frente a .NET 2 CLR ... ocurre que lo noté, pero dudo que muchas otras personas lo hicieran. Creo que es completamente razonable que el equipo de JIT ajuste las cosas como mejor lo crean, dentro de las garantías documentadas.

En última instancia, si esto hace que su código falle, ya tiene un error.

+0

¡Gracias por tu respuesta! ¿Sabe cómo iniciadores de tipo de llamada de compilador JIT? ¿Compila dos veces o no un método con call de un tipo inicialazer? Mead que antes de la primera llamada tengo una falta de rendimiento mientras el método se ejecuta, pero la segunda llamada de los métodos tiene un rendimiento normal. –

+0

@Smeliy: No sé, para ser honesto. Esperaría que ocurriera algún tipo de ruido, pero siempre dejé los detalles al equipo de JIT :) –

Cuestiones relacionadas