2012-03-18 37 views
8

Tôi đã xem xét các phương thức động một chút trong mã C# dựa trên phản chiếu và tôi chưa tìm ra chính xác chúng là gì. Có đặc biệt có vẻ là một lớp DynamicMethod cho phép tạo và đặc tả các phương thức CLR khi chạy. Nhưng sau đó cũng có lớp học MethodBuilder. Cả hai dường như làm những việc rất giống nhau. Rõ ràng là "hội đồng năng động" là các lớp học AssemblyBuilder và "loại động" là các lớp học TypeBuilder. Tất cả chúng đều nằm trong không gian tên System.Reflection.Emit trong mọi trường hợp.Phương pháp động và DynamicMethod khác với MethodBuilder là gì?

MSDN dường như có ít thông tin cấp cao quý giá về chủ đề này. Vì vậy, nếu ai đó có thể giải thích phương pháp động nào, ở đâu chính xác tất cả các lớp học XYZBuilder sẽ được phát tại đây và mỗi lớp được sử dụng cho điều gì, điều đó sẽ tuyệt vời. Bất kỳ loại Reflection.Emit khác và chức năng tôi nên biết về sẽ được đánh giá cao quá.

Trả lời

9

Tôi nghĩ the documentation for DynamicMethod giải thích này cũng:

Bạn có thể sử dụng lớp DynamicMethod để tạo ra và thực hiện một phương pháp tại thời gian chạy, mà không cần phải tạo ra một hội đồng năng động và một loại động để chứa phương pháp. Mã thực thi được tạo bởi trình biên dịch just-in-time (JIT) được khai hoang khi đối tượng DynamicMethod được khai hoang. Các phương thức động là cách hiệu quả nhất để tạo và thực thi một lượng nhỏ mã.

Nếu bạn cần tạo động một hoặc nhiều phương pháp, hãy sử dụng DynamicMethod. Nếu bạn muốn tạo toàn bộ các loại, điều đó có nghĩa là bạn cần tạo một assembly động (AssemblyBuilder), sau đó tạo một module bên trong nó (ModuleBuilder) và sau đó tạo một hoặc nhiều loại (TypeBuilder). Để tạo các phương thức bên trong các loại đó, bạn sẽ sử dụng MethodBuilder.

Sự khác biệt khác là GC: DynamicMethod s có thể luôn luôn được thu thập rác và chúng được thu thập từng cái một. Đó là, bất kỳ phương pháp có thể được thu thập ngay sau khi bạn ngừng sử dụng nó. Mặt khác, cụm động chỉ có thể được thu thập khi bạn chỉ định nó (bằng cách sử dụng AssemblyBuilderAccess.RunAndCollect) và chúng luôn được thu thập bằng lắp ráp. Ví dụ, nếu bạn có hai loại trong một hội đồng, và bạn chỉ sử dụng một trong số chúng, người kia không thể được thu thập.

+0

Doh. Tôi phải bỏ lỡ điều này khi đọc các trang MSDN quá muộn. Cảm ơn. – Noldorin

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