Tôi đang xem thành phần MvcContrib Grid và tôi bị mê hoặc, nhưng đồng thời bị đẩy lùi, bởi một thủ thuật cú pháp được sử dụng trong cú pháp Grid :
.Attributes(style => "width:100%")
Cú pháp trên đặt thuộc tính kiểu của HTML được tạo thành width:100%
. Bây giờ nếu bạn chú ý, 'style' không được chỉ định, được suy ra từ tên của tham số trong biểu thức! Tôi đã phải đào sâu vào vấn đề này và tìm thấy nơi 'phép thuật' xảy ra:
Hash(params Func<object, TValue>[] hash)
{
foreach (var func in hash)
{
Add(func.Method.GetParameters()[0].Name, func(null));
}
}
Vì vậy, thực sự, mã đang sử dụng thời gian chính thức, biên dịch, tên của các tham số để tạo từ điển của các cặp tên-giá trị thuộc tính. Cấu trúc cú pháp kết quả thực sự rất biểu cảm, nhưng đồng thời rất nguy hiểm. Việc sử dụng chung các biểu thức lambda cho phép thay thế các tên được sử dụng mà không có tác dụng phụ. Tôi thấy một ví dụ trong một cuốn sách nói rằng collection.ForEach(book => Fire.Burn(book))
tôi biết tôi có thể viết mã của mình collection.ForEach(log => Fire.Burn(log))
và nó có nghĩa tương tự . Nhưng với cú pháp MvcContrib Grid ở đây đột nhiên, tôi tìm thấy mã chủ động xem xét và đưa ra quyết định dựa trên tên tôi chọn cho các biến của mình!
Vì vậy, đây có phải là thông lệ chung với cộng đồng C # 3.5 / 4.0 và những người yêu thích biểu thức lambda? Hay là một mánh khóe lừa đảo mà tôi không nên lo lắng?