2010-04-17 63 views
14

Tôi đã tò mò về việc tạo lớp động trong thời gian chạy trong C# và tình cờ gặp phải bài viết này. http://olondono.blogspot.com/2008/02/creating-code-at-runtime.html Tôi rất tò mò muốn nghe một số ưu và khuyết điểm liên quan đến việc xây dựng một lớp học trong thời gian chạy.Tạo các lớp C# tại thời gian chạy

Mọi ý kiến?

+0

ngoài câu hỏi này? Bạn có thể lưu mã của bạn đã được tạo ra tại thời gian chạy bằng cách sử dụng Reflection đến một hội đồng. Bằng cách này bạn không phải tạo lại nó? –

+0

Có, trên thực tế, liên kết bạn cung cấp đã lưu mã được tạo. –

+0

lol. Buồn cười phần cuối cùng của đoạn mã đó. Cho thấy tôi đã chú ý đến bao nhiêu. Xin lỗi vì điều đó. –

Trả lời

19

Lập trình meta có tất cả các ưu điểm của việc tạo mã-thời gian xây dựng, nhưng không có bước mã bổ sung. Điều này là rất phổ biến trong mã thư viện, chẳng hạn như ORM, serializers, một số loại AOP, DI/IoC container, v.v.

  • + tránh sự cần thiết cho các bước xây dựng thêm hoặc viết mã trần tục
  • + mã như vậy có thể xử lý những gì thực là trường hợp tại thời gian chạy, thay vì phải xử lý bất kỳ hiếm edge-ca hoặc nhiều giấy gói xung quanh giấy gói (trang trí hoa văn)
  • + cho phép codegen trong các tình huống nơi mà các siêu dữ liệu chỉ được biết đến trong thời gian chạy
  • + runtime IL có thể truy cập nhiều hơn đến lĩnh vực tư nhân vv, nhờ vào cách DynamicMethod thể được kết hợp với một loại; mã được tạo đầy đủ (dll) sẽ yêu cầu [InternalsVisibleTo] hoặc tương tự, có thể là không thể
  • - không phải tất cả hệ thống hỗ trợ thời gian chạy mã-gen; nó bị vô hiệu hóa trên một số thiết lập máy chủ, khung nhỏ gọn, iPhone, v.v.
  • - đó là lỗi xấu xí để thực hiện. Bất kể bạn làm như thế nào, đây là không phải mã bình thường.
  • - nó cần một sự hiểu biết thực sự tốt về cách điều thực sự làm việc dưới tấm chăn
  • + nếu các lực lượng bạn để có được một sự hiểu biết thực sự tốt về cách điều thực sự làm việc dưới tấm chăn

Tôi hiện lại - Viết một thư viện hiện có để sử dụng thời gian chạy IL; nó rất bổ ích và tôi hài lòng với nó; nhưng nó không giống như bất cứ điều gì Tôi đã viết trước đây.

+0

Cảm ơn tất cả các ý kiến ​​của bạn. –

0

Có thể bạn đã có kinh nghiệm với các lớp được tạo theo thời gian. Generics được xây dựng tại thời gian chạy trong CLR, khi chúng là cần thiết đầu tiên. Vì vậy, là triển khai của XmlSerializer.

Xây dựng các lớp học từ đầu trong thời gian chạy có thể khá xấu xí (trừ khi bạn muốn xem xét nhiều phản ánh và mã Code Dom). Nó sẽ là một tình huống hiếm hoi mà đây là giải pháp rõ ràng và đơn giản nhất.

0

Ưu điểm: Bạn có thể tạo thời gian chạy bất cứ khi nào cần.

Nhược điểm: Bạn không có thời gian kiểm tra biên dịch, vì vậy nếu có bất cứ điều gì xảy ra, mọi thứ sẽ phát sinh.

Về cơ bản giống như lợi thế/bất lợi khi sử dụng Phản chiếu.

5

Đây không phải là vấn đề thuận và chống.

Đôi khi thuận tiện để tạo lớp dựa trên thông tin tẻ nhạt để chuyển đổi sang mã theo cách khác hoặc thông tin không có sẵn cho đến khi chạy.

Ví dụ trong bài viết được liên kết không phải là một cái gì đó bạn (với tư cách là người lập trình ứng dụng) bình thường sẽ làm. Nhưng nó rất hữu ích trong các công cụ, ví dụ, tạo ra các lớp dựa trên cơ sở dữ liệu hoặc lược đồ XML.

2

Có thời gian và địa điểm cho mọi thứ, kể cả điều này (Ví dụ: Generics). Tuy nhiên, tôi sẽ xem xét các lựa chọn thay thế để tạo ra các lớp học trong thời gian chạy trước khi tôi tiếp tục và làm điều đó. Có nhiều khả năng để duy trì sự thay thế tốt hơn để tạo ra các lớp học.

0

Một con bạn lưu ý là sử dụng bộ nhớ. Nếu bạn xây dựng động một lớp để xử lý một số yêu cầu mỗi khi bạn nhận được yêu cầu, thì bạn sẽ có nguy cơ tạo ra một lớp mới cho cùng một giá trị mỗi lần. Sau khi một lớp học hoặc hội đồng được tải vào một miền ứng dụng, nó không thể được dỡ bỏ. Vì vậy, hãy cố gắng tạo bộ nhớ cache và các lớp học được tạo ra ở bất kỳ nơi nào có thể.

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