2011-07-18 13 views
5

C# 4'te, beforefieldinit bayrağı olmadan türlerin davranışı değiştirildi, bu nedenle şimdi bir tür başlatıcı, sınıfın herhangi bir statik alanının ilk kullanımından önce çağırabilir.BeforeFieldInit davranışı neden .NET 4'te değişti?

Sorularım neden C#/NET ekibi bu davranışı değiştirdi? Ana sebep nedir? Bu değişikliğin herhangi bir anlam ifade ettiği herhangi bir pratik örnek gösterebilir misiniz?

+0

Başvuru? bunu nerede okudun? – leppie

+1

Burada okuyacağım: [link] (http://msmvps.com/blogs/jon_skeet/archive/2010/01/26/type-initialization-changes-in-net-4-0.aspx) Ve benim karşımda asıl neden uzatma yöntemlerinin performanslarıdır? Ne düşünüyorsun? –

+1

Alakasız. Bu şeyler bir sebepten dolayı belgelenmemiş. –

cevap

11

davranış daima belgelenmiş olanın sınırları içinde olmuştur - ben şüpheli JIT ekip için bir yol bulmayı başardılar 4.

o .NET tembel istekli olmaktan değişti bu sadece var Bir performans cezası olmadan tembelleşsin ... ya da muhtemelen başka bir yerde performansa yardımcı olur. Bu, .NET 4 CLR ve .NET 2 CLR içindeki davranışlarda böyle bir değişiklik olması olasılığına karşı yalnızca bir olması muhtemeldir, ancak bunu fark ettim, ancak diğer birçok insanın yaptığından şüpheliyim. JIT ekibinin belgelenmiş garantiler dahilinde uygun gördükleri şeyleri ayarlaması tamamen makul olduğunu düşünüyorum.

Sonuçta, kodunuz başarısız olursa, zaten bir hata var demektir.

+0

Cevabınız için teşekkür ederiz! JIT derleyici çağrı tipi başlatıcıların nasıl olduğunu biliyor musunuz? Onun, iki kez veya bir tür initialazer çağrısı ile bir yöntem derler? İlk çağrıdan önce bunu gerçekleştiririm, yöntem yürütülürken bir perfomance eksikliğim olur, ancak yöntemlerin ikinci çağrısı normal performansa sahiptir. –

+0

@Smeliy: Bilmiyorum, dürüst olmak gerekirse. Orada bir çeşit thunking olmasını beklerdim, ama detayları her zaman JIT ekibine bıraktım :) –