2017-02-15 18 views
12

Theo phần "10.12 Nhà xây dựng tĩnh" của "Đặc tả ngôn ngữ C#. Phiên bản 5.0" có thể được đánh dấu bằng công cụ sửa đổi "extern" và trong trường hợp này được gọi là một hàm dựng tĩnh bên ngoài bên ngoài.Mục đích của các nhà thầu tĩnh bên ngoài trong C# là gì?

Các nhà thầu tĩnh thông thường (không phải bên ngoài) được biết rõ. Chúng được sử dụng để khởi tạo các trường và thuộc tính tĩnh.

Các phương thức tĩnh bên ngoài thường được sử dụng để gọi các hàm gốc thông qua P/Invoke.

Và tôi cũng biết về các công cụ xây dựng khá độc đáo extern (xem thêm this question). Ví dụ, String lớp có một số như vậy declarations, các nhà xây dựng được thực hiện bởi thời gian chạy.

Nhưng liệu có bất kỳ tập quán thực sự nào của các nhà thầu tĩnh bên ngoài không? Tôi đã tìm kiếm qua số coreclr repo và không tìm thấy gì. Đặc tả ngôn ngữ không thể mô tả một số cấu trúc chưa bao giờ được sử dụng trong tự nhiên. Hoặc có thể?

Đoán của tôi: C# có các hàm tạo tĩnh bên ngoài chỉ vì CLR hỗ trợ chúng (về nguyên tắc).

+0

Tôi nghĩ bạn sẽ tìm thấy một đoạn văn bản rất giống nhau trong mọi tiểu mục của phần 10 từ 10.6 (Phương pháp) đến 10.13 (Destructors). Nếu không có gì khác, ít nhất là * nhất quán *. –

+1

Điều duy nhất 'extern' làm là thiết lập RVA của phương thức thành 0. Thời gian chạy còn lại để tìm ra phần còn lại. Xem thêm http://stackoverflow.com/q/38015024/. Có rất ít lý do cho các spec ngôn ngữ để cấm này kể từ khi công việc của trình biên dịch là tầm thường (nó sẽ được nhiều công việc để outlaw nó). Hơn nữa, vì các hàm tạo không thể đánh dấu 'DllImport', cách duy nhất để thực hiện các phương thức như vậy là với' MethodImplOptions.InternalCall', vì vậy thời gian chạy là người tiêu dùng duy nhất có thể, làm cho nó thậm chí còn ít thú vị hơn để cấm nó một cách rõ ràng. –

+0

Tại sao chúng không thực sự được sử dụng, điều đó đi vào lĩnh vực đầu cơ, nhưng nếu tôi là một người triển khai CLR, tôi rất muốn làm việc khởi tạo tĩnh dễ dàng dự đoán các điểm, thay vì dựa vào các quy tắc khá phức tạp để khởi tạo các kiểu tĩnh. Tất cả các mã đó gọi lại vào thời gian chạy anyway, do đó, nó sẽ làm gì, nhưng làm cho công việc của tôi khó khăn hơn. –

Trả lời

1

Từ MSDN:

Khi một tuyên bố xây dựng bao gồm một modifier extern, các nhà xây dựng được cho là một nhà xây dựng bên ngoài. Bởi vì một tuyên bố bên ngoài constructor không cung cấp thực thi thực tế, cơ quan xây dựng của nó bao gồm dấu chấm phẩy.

...

Có vẻ như chúng tôi không thể nghĩ ra một lý do chính đáng của việc sử dụng tuyên bố này và nó chắc chắn đúng. Nhưng khi bạn đào sâu hơn, bạn nhận ra có cả một thế giới lắp ráp động hoặc - Tạo mã.

Nếu bạn phát triển trình biên dịch cho nền tảng .NET, có thể bạn sẽ cần một số giải pháp khắc phục như trình biên dịch C# sử dụng. Tôi có thể nhận ra rằng một số triển khai lõi sử dụng constructor extern được thực hiện ở một nơi khác vì lý do thiết kế tốt.

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