2009-07-13 25 views
8

Tôi đã đọc bài viết MSDN về nó. Có vẻ như trong nội bộ nó là cách C# bộ đó là chức năng đó sẽ làm việc như chỉ số (tôi phải không?). Bây giờ, tôi đã thấy ví dụ sau:DefaultMemberAttribute - nó làm gì?

[DefaultMemberAttribute("Main")] 
public class Program { 

    public static void Main() { 
     ... 
    } 
} 

Bây giờ, tôi không hiểu ý nghĩa của nó.


Cảm ơn tất cả. Nhưng tôi vẫn không thể có được tính hữu ích của nó, ngoài việc lập chỉ mục. Khi nào chúng ta gọi InvokeMember?

+0

http://stackoverflow.com/a/294405/21239 –

Trả lời

5

Cá nhân tôi chưa bao giờ sử dụng nó, nhưng theo như tôi có thể nói, bạn đang xác định phương thức mặc định sẽ được gọi khi gọi InvokeMember. Vì vậy, bằng cách sử dụng đoạn mã mà bạn cung cấp, nếu tôi đã nói:

Program prog = new Program(); 
typeof(Program).InvokeMember("", null, null, prog, null); 

Bởi vì tôi rời đối số đầu tiên có sản phẩm nào của InvokeMember gọi nó sẽ sử dụng thuộc tính để xác định những gì các thành viên mặc định là của lớp học của bạn, trong bạn trường hợp nó là chính.

1

Thuộc tính DefaultMemberAttribute xác định thành viên mặc định sẽ được gọi khi một InvokeMember được gọi với một chuỗi trống làm đối số đầu tiên.

Nếu bạn đọc các tài liệu MSDN cho InvokeMember, nó dứt khoát nói:

thông số
tên
Loại: System.String
Các chuỗi chứa tên của các nhà xây dựng, phương pháp, bất động sản hoặc thành viên của trường để gọi.
-hoặc
Chuỗi trống ("") để gọi thành viên mặc định.

Thành viên mặc định sẽ là thành viên được khai báo bởi thuộc tính DefaultMemberAttribute.

9

Không, DefaultMemberAttribute được sử dụng bởi các ngôn ngữ như VB.NET để tìm thành viên được kích hoạt theo mặc định nếu không có thành viên nào được tham chiếu từ đối tượng, tức là thành viên được gọi bởi InvokeMember. Điều này thường được sử dụng kết hợp với các chỉ mục, như bạn đã lưu ý, nhưng nó không được C# sử dụng trực tiếp (trừ khi bạn sử dụng InvokeMember một cách rõ ràng).

Tuy nhiên, vì lợi ích của các ngôn ngữ .NET khác, C# không phát ra các DefaultMemberAttribute cho indexer của một lớp (nếu nó có một), như được chỉ ra bởi MSDN:

Các biên dịch C# phát ra các DefaultMemberAttribute trên bất kỳ loại nào chứa trình chỉ mục. Trong C#, đây là lỗi để tự gán thuộc tính loại với DefaultMemberAttribute nếu loại cũng khai báo một trình chỉ mục.

Tôi nghĩ MSDN nhầm lẫn mọi thứ bằng cách tham khảo các chỉ mục rất nhiều trong các nhận xét nhưng sau đó đưa ra một ví dụ không sử dụng trình chỉ mục. Để làm rõ, thành viên mặc định có thể là bất cứ điều gì, nhưng C# đưa ra hành vi đặc biệt cho các chỉ mục bằng cách phát ra thuộc tính cho bạn (nếu một chỉ mục tồn tại) ngoại trừ tất cả các ca sử dụng khác.

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