2011-09-01 11 views
5

Niedawno szukałem metadanych struktury C# Boolean.Dlaczego widok metadanych VS nie wyświetla jawnie wdrożonych interfejsów użytkowników?

Boolean implementuje interfejs IConvertible. Ale patrząc na członków Boolean, nie widziałem większości członków IConvertible.

Zrobiłem kilka testów z niektórymi kolegami, w tym tworzenie własnych klas, i doszliśmy do wniosku, że IConvertible musi być implementowane jawnie dla Boolean.

Pytanie brzmi, dlaczego nie są one widoczne? Rozumiem, że może to być "decyzja projektowa", ale rozumiem, że zwiększyłoby to wartość, gdyby były widoczne dla każdego, kto sprawdza metadane.

Testy przeprowadzono w VS2010 .NET4.0

+3

Mówisz o widoku Metadanych w VS, a nie o rzeczywistych metadanych. Rzeczywiste metadane oczywiście zawierają jawne implementacje interfejsu. – CodesInChaos

+0

Dzięki za wyjaśnienia –

Odpowiedz

5

Powodem jest to, że metody te istnieją tylko po to, aby zaimplementować interfejs I, a nie aby rozszerzyć interfejs publiczny klasy.

Chodzi mi o to, że jeśli masz następujące elementy:

public class MyClass : IConvertible 
{ 
// implementation 
} 

Możesz chcieć MyClass być zamienny, rzeczywiście, tak można przekazać odniesienia do niego z metodami, które oczekują IConvertible:

public void DoSomethingWithConvertible(IConvertible conv) 

Ale możesz nie chcieć zmiennych typu MyClass, aby ujawnić metody Convert. Po prostu nie chcesz, aby interfejs publiczny MyClass miał tę metodę, a następnie implementujesz interfejs jawnie. Cała idea podejścia. Oznacza to, że nie jest dozwolone następuje:

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

jednak następuje nadal być dozwolone: ​​

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

Cały Ideą jest to, że nawet jeśli używamy dokładnie ten sam przykład, ponieważ MyClass nie ma tej metody. A jak IConvertible ma tę metodę.Pomyśl o tym, jakbyś zezwalał instancji na dzielenie osobowości.

Zazwyczaj kończę implementowanie każdego interfejsu w sposób niejawny. Są jednak bardzo specyficzne sytuacje, w których będę je implementował w sposób jawny z przyczyn wymienionych powyżej.

BTW, dzięki za świetne pytanie!

-1

explicitly implemented. Tutaj można znaleźć wszystkie implementowane elementy zamienne: http://msdn.microsoft.com/en-us/library/system.boolean.aspx

+0

Ale to wymaga mnie do spojrzenia na MSDN. Chciałbym zrozumieć, dlaczego nie są one widoczne w metadanych. –

+0

Intellisense ukrywa je, ponieważ twórca zdecydował się je zaimplementować jawnie = musisz traktować obiekt jako interfejs, aby uzyskać właściwą metodę (metody). – jgauffin

2

Ponieważ implementacja jawnego interfejsu faktycznie ukrywa implementację.

2

Metadane rzeczywiście pokazują explicitly implemented. Masz na myśli intellisense, a nie metadane?

Powiedziałbym, że jest to zgodne z projektem i pomaga programistom powiedzieć Boolean, aby ograniczyć interfejs do podzbioru. Ograniczając to, co jest sugerowane do użycia, staje się również widoczne, co jest uważane za nieprawidłowe użycie. Na przykład. generalnie nie zaleca się wyświetlania wartości Boolean jako określonej wartości liczbowej, ale w niektórych przypadkach jest to przydatne, aby móc to zrobić w każdym razie.

IDictinary<T,K> to kolejny przykład. Implementuje on IEnumerable<KeyValuePair<T,K>>, umożliwiając iterację wszystkich par w kolekcji i ICollation<KeyValuePair<T,K>>. Możesz więc wywoływać Dodaj do słownika z kluczem KeyValuePair, ale zazwyczaj powinieneś użyć funkcji sprawdzania klasy za pomocą narzędzia zapewniającego dostęp do metadanych do odczytu. ILDASM dla jednego i rzeczywiście można znaleźć metadane jawnie zaimplementowanych metod.

+0

Mam na myśli metadane. Zgadzam się, że intellisense nie pokazuje wyraźnie wdrożonego. –

+0

@luis, ale to jest złe, jest częścią metadanych. –

+0

Widzę tylko, że Boolean deklaruje implementację IConvertible, ale nie widzę członków IConvertible w metadanych w VS2010. Czy możesz? –

Powiązane problemy