Nhiều phương pháp trong BCL được đánh dấu bằng thuộc tính [MethodImpl(MethodImplOptions.InternalCall)]
. Điều này indicates rằng "phương pháp được thực hiện trong thời gian chạy ngôn ngữ chung".Điểm của MethodImplOptions.InternalCall là gì?
Điểm thiết kế khung theo cách này là gì đối với các hướng dẫn CIL rõ ràng rằng thời gian chạy sẽ bị buộc thực hiện? Cuối cùng, thuộc tính này đang tạo ra các nghĩa vụ hợp đồng cho thời gian chạy, nhưng theo một cách mà tôi có vẻ khó hiểu và không rõ ràng ngay lập tức.
Ví dụ, Math.Pow
có thể đã được viết theo cách này (xin lỗi hỗn hợp không chính thức của tôi về C# + IL và IL chính nó nếu nó là xấu, điều này chỉ là một mẫu để giải thích quan điểm của tôi):
public static double Pow(double x, double y)
{
ldarg.0
ldarg.1
pow // Dedicated CIL instruction
ret
}
thay vì cách hiện tại:
[MethodImpl(MethodImplOptions.InternalCall)]
public static double Pow(double x, double y);
Tại sao MethodImplOptions.InternalCall
tồn tại?
Nó không phải như vậy không thể làm việc, nó chỉ quy mô khủng khiếp. Các giao dịch stack là tiềm ẩn cho các opcodes IL, rất nhiều công cụ sẽ phải được cập nhật để xử lý các chữ ký hàm. Nó miễn phí khi tờ khai nằm trong siêu dữ liệu. Và dễ dàng mở rộng vượt ra ngoài tiêu chuẩn Ecma-335. –
@Hans: là câu hỏi về việc thêm hỗ trợ cho các hướng dẫn IL mới? Tôi hiểu rằng Ani muốn biết tại sao phương pháp 'InternalCall' lại ở đó ngay từ đầu. Chỉ cần hỏi ... –
@thecoon - '// Hướng dẫn CIL chuyên dụng' là một gợi ý tốt. –