2011-07-18 15 views
5

W języku C# 4 zmieniono zachowanie typów bez flagi beforefieldinit, więc teraz inicjator może wywołać przed pierwszym użyciem dowolnego pola statycznego klasy.Dlaczego zachowanie BeforeFieldInit zmieniło się w .NET 4?

Moje pytanie brzmi: dlaczego zespół C#/.NET zmienił to zachowanie? Jaki jest główny powód? Czy możesz pokazać jakiś praktyczny przykład, gdzie ta zmiana ma sens?

+0

Odniesienie? Gdzie to przeczytałeś? – leppie

+1

Przeczytałem tutaj: [link] (http://msmvps.com/blogs/jon_skeet/archive/2010/01/26/type-initialization-changes-in-net-4-0.aspx) I w mojej opozycji głównym powodem jest wydajność metod rozszerzenia? Co myślisz? –

+1

Nieistotne. Te rzeczy są nieudokumentowane z jakiegoś powodu. –

Odpowiedz

11

Zachowanie zawsze w granicach co udokumentowany - to tylko, że zmienił go przed chętny do leniwy w .NET 4.

I podejrzany zespół JIT udało się znaleźć drogę do sprawiają, że jest leniwy bez kary za wydajność ... lub może pomaga w osiągnięciu wydajności gdzie indziej. Jest to prawdopodobnie tylko jedna zmiana w zachowaniu w .NET 4 CLR w stosunku do .NET 2 CLR ... zdarza się, że to zauważyłem, ale wątpię, czy zrobiło to wielu innych ludzi. Sądzę, że zespół JIT jest całkowicie uzasadniony, aby dostosować rzeczy zgodnie z ich potrzebami, w ramach udokumentowanych gwarancji.

Ostatecznie, jeśli spowoduje to błąd twojego kodu, masz już błąd.

+0

Dziękujemy za odpowiedź! Czy wiesz, jak inicjuje inicjatora kompilatora JIT? Kompiluje on metodę wywołania inicjału typu dwukrotnie, czy nie? Mówię, że przed pierwszym połączeniem mam brak wydajności podczas wykonywania metody, ale drugie wywołanie metod ma normalną wydajność. –

+0

@Smeliy: Nie wiem, szczerze mówiąc. Spodziewałbym się, że będzie coś w rodzaju thunkingu, ale zawsze zostawiłem szczegóły zespołowi JIT :) –