Vâng, câu hỏi này khá cũ và tôi đang đợi tf get
để hoàn thành ... vì vậy tôi sẽ tự trả lời.
Có, LCG đã chết trong hầu hết các trường hợp.
Chúng tôi đã từng sử dụng LCG một chút và giờ đây tất cả đã được chuyển đổi để sử dụng cây biểu thức thay thế. Chúng dễ xây dựng hơn nhiều, mã dễ bảo trì và gỡ lỗi dễ dàng hơn, và các thông báo lỗi thường có nhiều thông tin hơn 'Thao tác có thể làm mất ổn định thời gian chạy' khi bạn gặp sự cố trong quá trình phát triển.
Nhưng, có lẽ quan trọng nhất, các cây biểu thức được tổng hợp theo cách mà Reflection.Emit thì không. Điều này có nghĩa là kiến trúc của các thành phần được sử dụng để tạo mã thời gian chạy có thể có nhiều mô đun hơn và thậm chí cho phép các plugin mở rộng khung công tác tạo mã.
Điều tôi đã tìm thấy được hỗ trợ bởi Reflection.Emit không được hỗ trợ trực tiếp trong cây biểu thức đang đặt các trường .initonly
. Này, tuy nhiên, có thể đạt được bằng cách sử dụng một lớp helper ít và gọi nó trong cây biểu hiện, ví dụ như chúng ta sử dụng là dưới đây:
internal static class FieldHelper
{
public static TTarget AssignInitOnlyField<TTarget, TField>(
TTarget target, string fieldName, TField value)
{
var field = target.GetType().GetField(
fieldName,
BindingFlags.Instance|BindingFlags.Public|BindingFlags.NonPublic);
var boxed = (object)target; // required for value type support
field.SetValue(boxed, value);
return (TTarget)boxed;
}
}
Nó đáng nói là người xuống phía của việc sử dụng cây biểu hiện khá hơn LCG là việc xây dựng và biên dịch các cây biểu thức chắc chắn chậm hơn so với việc phát ra các mã op nguyên trực tiếp. Giả sử bạn đang lưu vào bộ nhớ đệm các phương thức được biên dịch, đây không phải là vấn đề quan trọng, nhưng đó là một lý do khiến bạn vẫn có thể buộc bạn phải sử dụng LCG.
Nguồn
2011-04-12 19:11:02
Câu trả lời rõ ràng là không. LCG chính xác là hữu ích vì nó cho phép biên dịch IL trong thời gian chạy, làm cho nó hoạt động hiệu quả hơn rất nhiều. Nếu bạn không cần mã được xây dựng để được nhanh chóng, bạn không cần nó. Vì vậy, về cơ bản họ LCG vẫn có niche của nó. – Benja