2009-12-03 20 views
16

Mọi nhà phát triển .net đều biết về khái niệm về thuộc tính. Một thô 99,99%, nó chỉ là một phần của siêu dữ liệu dán cùng nhau hai phương pháp, một getter, và một setter.Sự tò mò của phương thức let_ property

Điều tương tự thường xảy ra với các sự kiện, với phương thức thêm, xóa và gọi.

ECMA-335 mô tả loại ngữ nghĩa phương thức «Khác», sẽ áp dụng cho thuộc tính hoặc sự kiện. Về mặt khái niệm, một tài sản hoặc một sự kiện có thể có nhiều phương thức «khác».

Hôm nay là ngày đầu tiên tôi tình cờ gặp một thuộc tính với phương thức «khác». Và tất nhiên nó phải liên quan đến COM. Các EnvDTE.Property giao diện, trong lắp ráp EnvDTE (sử dụng để viết addin để Visual Studio), chứa một tài sản được xác định như sau:

.property object Value() 
{ 
    .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = (01 00 00 00 00 00 00 00) 
    .get instance object EnvDTE.Property::get_Value() 
    .other instance void EnvDTE.Property::let_Value(object) 
    .set instance void EnvDTE.Property::set_Value(object) 
} 

Với let_Value được định nghĩa là:

.method public hidebysig newslot specialname abstract virtual 
     instance void let_Value([in] object marshal(struct) lppvReturn) runtime managed internalcall 
{ 
    .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = (01 00 00 00 00 00 00 00) 
} 

Rõ ràng, VBScript và các phiên bản của VB trước VB.NET có thể định nghĩa các thuộc tính bằng cách sử dụng từ khóa Let. Và Let có cùng chữ ký với Set. Tôi cảm thấy rằng có một mối quan hệ ở đây.

Nhưng có ai biết thuộc tính này đã được khai báo bằng ngôn ngữ mà EnvDTE đã được viết không? Làm thế nào tôi có thể tạo ra một hội đồng với các mô hình tương tự (không sử dụng ilasm, đó sẽ là quá dễ dàng)? Và có ai đã phải đối mặt với một tài sản tương tự?

Và có ai đã thấy các thuộc tính «khác», có thể có ngữ nghĩa khác với ngữ nghĩa này không? Và nếu có, chúng được sử dụng để làm gì?

Trả lời

21

Đó là một điều COM được hiển thị trong VB. Set chỉ định tham chiếu để thay thế mục được đề cập của thuộc tính, trong khi Let dự kiến ​​sẽ sao chép nội dung của toán hạng vào thuộc tính hiện có. (Xem thêm Property Get).

IIRC đây không phải là điều COM cốt lõi, nhiều thứ được sử dụng khi ngôn ngữ không có đủ sức mạnh biểu đạt để đối phó với giá trị so với các vấn đề tham chiếu đến mức độ chính xác - tôi tin rằng nó chỉ có thể áp dụng khi bạn đang sử dụng IDispatch (nơi bạn đang định địa chỉ theo id thuộc tính chứ không phải là phương thức) thay vì giao diện tùy chỉnh (nơi bạn luôn phải giải quyết một phương thức và gọi đó). Tôi khá chắc chắn VB.NET (hoặc các ngôn ngữ khác. NET) không bề mặt những thứ như vậy và do đó họ là một điều hiếm.

Essential COM by Box không đề cập đến nó (chỉ propget và propput để nhận và đặt). COM IDL & Thiết kế giao diện bởi Tiến sĩ Al Major đề cập đến nó trên P106 ans nói:

dispinterface DMyInterface { methods: 
... 
[id(3), propputref] void lMyProp([in] IDispatch *pDisp); 
} 

Thuộc tính propputref là một điều nhỏ lẻ mà có nguồn gốc từ các idiosynracies cú pháp Visual Basic. Hãy xem xét những điều sau:

Dim val as DMyOtherInterface 
Dim var as DMyInterface 

Set var.lMyProp = val 
var.lMyProp = val 

Hai bài tập đều được cho phép nhưng có nghĩa là hoàn toàn khác nhau. Việc sử dụng các từ khóa Set trong assginment đầu tiên chỉ ra rằng lMyProp đang được giao một giao diện [...].Nhiệm vụ thứ hai là giá trị simpe, với giá trị của đối tượng val, là giá trị của thành viên mặc định của giao diện DMyOtherInterface (thành viên mặc định là thành viên được gắn thẻ bởi số DISPID_VALUE ID, như sẽ được giải thích ngay), đang được gán cho thuộc tính lMyProp của giao diện DMyInterface.

Phép gán đầu tiên được thực hiện bằng phương pháp propputref được liên kết với thuộc tính lMyProp, trong khi nhiệm vụ thứ hai sử dụng phương thức propput. Để làm việc này, cả hai phương thức propputref phải được xác định. Nếu bạn bối rối bằng cách làm việc này, bạn không đơn độc. Trong khi VB có nhiều tính năng tốt về cơ bản đã thay đổi bản chất của lập trình, định nghĩa của ngôn ngữ chủ yếu dựa trên thị trường hơn là được thiết kế và đôi khi nó hiển thị.

Ngạc nhiên là tôi chưa bao giờ sử dụng cuốn sách chính kể từ khi đọc nó vào đầu năm 2000 trước khi COM và .COM bust (Đó là một cuốn sách tốt cho mục đích của nó). Cảm ơn vì chuyến đi xuống làn đường bộ nhớ - Tôi thích cách mọi người nói với chúng tôi rằng chương trình tiếp tục khó khăn hơn!

Dont có cuốn sách Lidin với tôi để xem nếu nó đề cập đến .other nhưng tôi chắc chắn rằng bạn làm (BTW thanks a lot cho Mono.Cecil)

+0

Heh, cảm ơn vì đã điều tra kỹ lưỡng! –

+0

Niềm vui của tôi. Tôi chắc chắn rằng tôi sẽ đánh bạn cho một số thứ Cecil trong trở lại mặc dù tại một thời gian trong tương lai: P –

+0

Ồ, và fwiw, không phải cuốn sách của Lidin cũng như tiêu chuẩn CLI chú thích cung cấp nhiều thông tin hơn. Nó chỉ là có thể có các phương pháp khác liên quan đến và sự kiện hoặc một tài sản. –

2

Visual Studio tự động hóa dựa trên COM. Các tài sản trong câu hỏi có lẽ đã được tạo ra thông qua một công cụ để hỗ trợ COM Interop (tlbimp tiềm năng). Tôi nghi ngờ bất cứ ai mã hóa này trong một ngôn ngữ dựa trên Net thực tế.

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