Nếu bạn có phương thức hoặc loại Foo<T>
thì CLR có thể biên dịch nhiều phiên bản cho T. khác nhau. Tôi biết rằng tất cả các loại tham chiếu đều có cùng phiên bản. Làm thế nào nó hoạt động cho các cấu trúc? Mã đôi khi được chia sẻ hoặc không bao giờ được chia sẻ cho các cấu trúc khác nhau? Tôi có thể tưởng tượng rằng mã được chia sẻ cho tất cả các cấu trúc có cùng kích thước, ví dụ.Khi nào mã được chia sẻ cho các phiên bản khác nhau của generics trong CLR?
Tôi quan tâm bởi vì tôi đang tự hỏi về ví dụ sau:
interface IBar
{
void DoBar();
}
struct Baz : IBar
{
public void DoBar(){ ... }
}
struct Quux : IBar
{
public void DoBar(){ ... }
}
Bây giờ nếu tôi làm như sau:
public void ExecuteBar<T>(T bar) where T:IBar
{
bar.DoBar();
}
ExecuteBar(new Baz());
ExecuteBar(new Quux());
này sẽ tạo ra hai phiên bản của ExecuteBar
, mỗi một gọi trực tiếp (không ảo) trực tiếp đến Bar.DoBar()
và Quux.DoBar()
? Hoặc là công văn được thực hiện tại thời gian chạy?
Chính xác. Vì vậy, tôi đoán rằng, ở cấp độ người hỏi đang quan tâm, câu trả lời là: Phương án thay thế trước đây, hai phương pháp khác nhau được tạo, một cho mỗi loại giá trị và công văn không phải là ảo. –
Cảm ơn! @ Jeppe: đúng vậy. Nó có thể là trường hợp mã được tối ưu hóa thêm bằng cách nội tuyến, và điều đó thậm chí còn hiệu quả hơn, nhưng tôi quan tâm đến mô hình hiệu năng cơ sở của các cuộc gọi giao diện trên các cấu trúc có kiểu được chuyển một cách rõ ràng như tham số cho một phương thức hoặc lớp chung . Tôi biết rằng bạn không nên dựa vào hành vi này, nhưng nó có thể phục vụ như là một điểm khởi đầu để tối ưu hóa. Nếu một công văn làm chậm mã, nó có thể đáng để thay đổi một lớp thành một cấu trúc để loại bỏ công văn. – Jules