2011-07-18 28 views
5

Trong C# 4, hành vi của các loại không có cờ beforefieldinit đã được thay đổi, do đó, bây giờ một trình khởi tạo kiểu có thể gọi trước khi sử dụng đầu tiên của bất kỳ trường tĩnh nào của lớp.Tại sao thay đổi hành vi của BeforeFieldInit trong .NET 4?

Câu hỏi của tôi là tại sao nhóm C# /. NET đã thay đổi hành vi đó? Lý do chính là gì? Bạn có thể cho thấy bất kỳ ví dụ thực tế nào mà thay đổi này có ý nghĩa gì không?

+0

Tham chiếu? Bạn đã đọc nó ở đâu? – leppie

+1

Tôi đọc ở đây: [link] (http://msmvps.com/blogs/jon_skeet/archive/2010/01/26/type-initialization-changes-in-net-4-0.aspx) Và trong phản đối của tôi lý do chính là sự hoàn hảo của các phương pháp mở rộng? Bạn nghĩ sao? –

+1

Không liên quan. Những điều này là không có giấy tờ vì một lý do. –

Trả lời

11

Các hành vi luôn nằm trong giới hạn của những gì ghi - nó chỉ là nó thay đổi từ mong muốn lười biếng trong .NET 4.

tôi nghi ngờ đội JIT quản lý để tìm một cách để làm cho nó lười biếng mà không có một hình phạt hiệu suất ... hoặc có thể nó giúp hiệu suất ở một nơi khác. Điều này có thể chỉ là một thay đổi hành vi như vậy trong .NET 4 CLR và .NET 2 CLR ... nó xảy ra mà tôi nhận thấy nó, nhưng tôi nghi ngờ rằng nhiều người khác đã làm. Tôi nghĩ hoàn toàn hợp lý khi nhóm JIT điều chỉnh mọi thứ khi họ thấy phù hợp, trong phạm vi bảo đảm được ghi nhận.

Cuối cùng, nếu điều này làm cho mã của bạn không thành công, bạn đã có một lỗi rồi.

+0

Cảm ơn câu trả lời của bạn! Bạn có biết làm thế nào JIT trình biên dịch gọi loại initialazers? Nó biên dịch một phương thức với lời gọi của một kiểu khởi đầu kiểu hai lần hay không? Tôi mead rằng trước khi gọi đầu tiên tôi có một thiếu perfomance trong khi phương pháp thực hiện, nhưng thứ hai gọi của các phương pháp có perfomance bình thường. –

+0

@Smeliy: Tôi không biết, phải trung thực. Tôi mong đợi sẽ có một số vấn đề xảy ra, nhưng tôi đã luôn để lại chi tiết cho nhóm JIT :) –

Các vấn đề liên quan