2011-09-01 20 views
5

Ngày khác tôi đang xem xét siêu dữ liệu cấu trúc C# Boolean.Tại sao chế độ xem Siêu dữ liệu của VS không hiển thị các thành viên được triển khai giao diện rõ ràng

Boolean thực hiện giao diện IConvertible. Nhưng nhìn vào các thành viên của Boolean tôi không thể thấy hầu hết các thành viên IConvertible.

Tôi đã thực hiện một số thử nghiệm với một số đồng nghiệp, bao gồm việc tạo các lớp riêng của chúng tôi và đi đến kết luận rằng IConvertible phải được triển khai rõ ràng cho Boolean.

Câu hỏi đặt ra là tại sao chúng không hiển thị? Tôi hiểu nó có thể là 'theo quyết định thiết kế' nhưng tôi hiểu rằng nó sẽ thêm giá trị lớn hơn nếu chúng hiển thị với bất kỳ ai kiểm tra siêu dữ liệu.

Các thử nghiệm đã được thực hiện trong VS2010 .NET4.0

+3

Bạn đang nói về chế độ xem Siêu dữ liệu trong VS chứ không phải về siêu dữ liệu thực tế. Siêu dữ liệu thực tế rõ ràng chứa triển khai giao diện rõ ràng. – CodesInChaos

+0

Cảm ơn bạn đã làm rõ –

Trả lời

5

Lý do là các phương thức đó chỉ có để triển khai giao diện I và không làm tăng thêm giao diện công khai của lớp.

Những gì tôi có nghĩa là nếu bạn có điều sau đây:

public class MyClass : IConvertible 
{ 
// implementation 
} 

Bạn có thể muốn MyClass được chuyển đổi, thực sự, vì vậy bạn có thể vượt qua tài liệu tham khảo của nó với các phương pháp mà mong đợi IConvertible:

public void DoSomethingWithConvertible(IConvertible conv) 

Nhưng bạn có thể không muốn các biến loại MyClass để hiển thị các phương pháp chuyển đổi. Bạn chỉ đơn giản là không muốn giao diện công cộng của MyClass có phương thức đó, sau đó bạn thực hiện giao diện một cách rõ ràng. Đó là toàn bộ ý tưởng về cách tiếp cận này. Điều này có nghĩa sau đây không được phép:

MyClass a = new MyClass(); 
a.Convert(); 

Tuy nhiên, sau đây vẫn được được phép:

MyClass a = new MyClass(); 
((IConvertible)a).Convert(); 

Toàn bộ ý tưởng đằng sau này là mặc dù chúng ta đang sử dụng cùng một ví dụ chính xác, một vì MyClass không có phương pháp. A như IConvertible không có phương pháp.Hãy nghĩ về nó như thể bạn đang cho phép cá thể có tính cách phân chia.

Thông thường, tôi kết thúc triển khai mọi giao diện một cách ngầm định. Tuy nhiên, có những tình huống rất cụ thể khi tôi triển khai chính xác chúng một cách rõ ràng vì những lý do được nêu ở trên.

BTW, cảm ơn câu hỏi tuyệt vời!

-1

Họ là explicitly implemented. Bạn có thể tìm thấy tất cả các chuyển đổi được triển khai tại đây: http://msdn.microsoft.com/en-us/library/system.boolean.aspx

+0

Nhưng điều đó đòi hỏi tôi phải nhìn vào MSDN. Tôi muốn hiểu lý do tại sao chúng không hiển thị trong siêu dữ liệu –

+0

Intellisense ẩn chúng vì nhà phát triển đã chọn triển khai chúng một cách rõ ràng = bạn phải coi đối tượng là giao diện được triển khai để có được (các) phương thức thích hợp – jgauffin

2

Do triển khai giao diện rõ ràng thực sự ẩn cài đặt.

2

Siêu dữ liệu thực sự hiển thị số explicitly implemented. Bạn có nghĩa là intellisense và không siêu dữ liệu?

Tôi muốn nói điều đó được thiết kế và giúp nhà phát triển nói Boolean hạn chế giao diện cho một tập hợp con. Bằng cách hạn chế những gì được đề xuất để sử dụng nó cũng trở nên có thể nhìn thấy những gì được coi là sử dụng bất thường. Ví dụ. nó thường không được khuyến khích để xem một giá trị Boolean như một giá trị số cụ thể nhưng trong một số trường hợp nó tiện dụng để có thể làm điều đó anyways.

IDictinary<T,K> là một ví dụ khác. Nó thực hiện IEnumerable<KeyValuePair<T,K>> làm cho nó có thể lặp qua tất cả các cặp trong bộ sưu tập và ICollation<KeyValuePair<T,K>>. Vì vậy, bạn có thể gọi Thêm trên từ điển được cung cấp một KeyValuePair nhưng thông thường bạn nên sử dụng Add(K, key, T Value)

Hãy thử kiểm tra lớp học bằng công cụ cung cấp quyền truy cập đọc vào siêu dữ liệu. ILDASM cho một và bạn thực sự có thể tìm thấy siêu dữ liệu của các phương thức được triển khai rõ ràng.

+0

Tôi có nghĩa là siêu dữ liệu. Tôi đồng ý intellisense trong không hiển thị một cách rõ ràng thực hiện. –

+0

@luis nhưng sau đó nó sai nó là một phần của siêu dữ liệu. –

+0

Tôi chỉ có thể thấy Boolean tuyên bố triển khai IConvertible nhưng tôi không thể thấy thành viên IConvertible trong siêu dữ liệu trong VS2010. Bạn có thể? –

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