2012-02-17 12 views
12

Tôi không tin rằng mã được tạo ra sẽ kiểm tra xem lớp đã được khởi tạo mỗi khi nó truy cập một thành viên tĩnh (bao gồm các hàm). Tôi tin rằng việc kiểm tra mọi truy cập sẽ không hiệu quả. Tôi nhìn §17.11 trong ECMA 334 và nó nóiLàm thế nào để C# biết khi chạy một hàm tạo tĩnh?

Việc thực hiện một constructor tĩnh được kích hoạt bởi các đầu tiên của sự kiện sau đây xảy ra trong một miền ứng dụng:

  • Một ví dụ của lớp được tạo ra.
  • Bất kỳ thành viên tĩnh nào trong lớp đều được tham chiếu.

Có vẻ như cách tìm ra thời điểm 'đầu tiên' xảy ra không được xác định. Tôi không thể nghĩ ra bất kỳ cách nào để làm điều đó nhưng để kiểm tra mọi lúc. Làm thế nào nó có thể được thực hiện?

+3

Có liên quan, đối với trường hợp tĩnh: http://csharpindepth.com/Articles/General/Beforefieldinit.aspx - nó không tầm thường –

+0

Không phải là câu hỏi đặt con trỏ hàm thành vị trí khác sau lần đầu tiên gọi điện? Lúc đầu nó trỏ vào bộ nạp lớp hoặc bất cứ thứ gì, sau đó ở phần thân của hàm ... – user1096188

+1

@Marc: Điều đó thảo luận khi gọi hàm dựng tĩnh TRƯỚC KHI truy cập đầu tiên vào một thành viên tĩnh được cho phép, không phải cách truy cập đầu tiên được phát hiện . –

Trả lời

5

Khi bạn đang tạo mã khi chạy, bạn có nhiều tùy chọn. Bạn có thể gọi một con trỏ hàm NULL, bắt vi phạm truy cập, chạy hàm tạo tĩnh, biên dịch trình lấy thuộc tính, cập nhật con trỏ hàm và tiếp tục. Hoặc có getter thuộc tính gọi một hàm trợ giúp chạy hàm khởi tạo tĩnh và viết lại mã getter mà không có lời gọi hàm trợ giúp. Hoặc chèn một kiểm tra trên mỗi truy cập thành viên tĩnh, rằng khi nhấn recompiles chức năng gọi điện thoại với kiểm tra loại bỏ.

16

Khi bạn có vấn đề cần giải quyết, kỹ thuật tốt là: giải quyết một vấn đề khó khăn hơn, sao cho giải pháp của vấn đề nhỏ của bạn được giải quyết bằng giải pháp của vấn đề khó hơn.

CLR có vấn đề khó giải quyết hơn: nó phải chạy chính xác jitter một lần trên mọi phương thức ngay trước khi phương thức được gọi lần đầu tiên. Nếu CLR có thể giải quyết vấn đề đó, thì rõ ràng nó có thể giải quyết được vấn đề phụ tương đối tầm thường khi phát hiện khi một ctor tĩnh cần chạy.

Có lẽ câu hỏi của bạn sẽ là "làm thế nào để người jitter biết khi nào để jit một phương pháp cho lần đầu tiên?"

+0

Thú vị. Tôi chỉ giả định JIT trên các hệ thống không nhúng chỉ cần jits tất cả mọi thứ ngay lập tức và đứng bằng cách tải dlls mới. Tôi cho rằng các hệ thống nhúng sử dụng trước biến chứng thời gian. Giả định xấu đặc biệt là khi mã lớn đi vào hoạt động. 1 cho những suy nghĩ –

+1

@ acidzombie24 thực sự, một số hệ thống nhúng không JIT/AOT ** ở tất cả ** - Micro Framework là một thông dịch viên IL (vượt qua các ngón tay mà tôi đã không có điều này ngược ...) –

+0

và một số hệ thống như thế nào.Net Compact Framework JIT chỉ những điều cơ bản, ví dụ: nhận tài sản là một cuộc gọi hàm –