2011-09-01 9 views
5

El otro día yo estaba buscando en los metadatos C# booleana estructura.¿Por qué la vista VS metadatos no muestra explícita de interfaces implementadas miembros

Boolean implementa el IConvertible interfaz. Pero mirando a los miembros de Boolean no pude ver a la mayoría de los miembros de IConvertible.

he hecho algunas pruebas con algunos colegas, incluyendo la creación de nuestras propias clases, y llegaron a la conclusión de que IConvertible debe implementarse de manera explícita de Boole.

La pregunta es, ¿por qué no son visibles? Entiendo que podría ser una 'decisión de diseño', pero entiendo que agregaría un mayor valor si fueran visibles para cualquiera que inspeccione los metadatos.

Las pruebas se realizaron en VS2010 .NET4.0

+3

Estás hablando de la vista Metadata en VS y no de los metadatos reales. Los metadatos reales obviamente contienen implementaciones de interfaz explícitas. – CodesInChaos

+0

Gracias por la aclaración –

Respuesta

5

La razón es que esos métodos están allí sólo para aplicar la I-interfaz y no para aumentar la interfaz pública de clase.

Lo que quiero decir es que si tiene lo siguiente:

public class MyClass : IConvertible 
{ 
// implementation 
} 

Es posible que desee MiClase sea convertible, de hecho, por lo que puede pasar referencias de la misma a los métodos que esperan IConvertible:

public void DoSomethingWithConvertible(IConvertible conv) 

Pero es posible que no desee que las variables de tipo MyClass expongan los métodos Convert. Simplemente no quiere que la interfaz pública de MyClass tenga ese método, luego implementa la interfaz explícitamente. Esa es toda la idea del enfoque. Esto significa que no se permite lo siguiente:

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

Sin embargo, todavía se debe permitir lo siguiente:

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

La idea detrás de esto es que a pesar de que estamos usando exactamente el mismo ejemplo, una como MyClass no tiene el método. A como IConvertible tiene el método.Piense en ello como si estuviera permitiendo que la instancia tenga personalidad dividida.

Normalmente finalizo la implementación implícita de todas las interfaces. Sin embargo, hay situaciones muy específicas en las que las implementaría explícitamente exactamente por los motivos descritos anteriormente.

BTW, gracias por la gran pregunta!

2

Debido a la implementación de interfaz explícita en realidad oculta la aplicación.

2

Los metadatos demuestran de hecho el explicitly implemented. ¿Te refieres a intellisense y no a metadatos?

Yo diría que eso es por diseño y ayudan al desarrollador de, por ejemplo booleana para restringir la interfaz a un subconjunto. Al restringir lo que se sugiere utilizar, también se vuelve visible lo que se considera uso anormal. P.ej. en general, no se aconseja ver un valor booleano como un valor numérico específico, pero en algunos casos es útil para poder hacerlo de todos modos.

IDictinary<T,K> es otro ejemplo. Implementa IEnumerable<KeyValuePair<T,K>>, lo que permite iterar sobre todos los pares en la colección y ICollation<KeyValuePair<T,K>>. Por lo tanto, puede llamar Agregar en el diccionario dado un KeyValuePair, pero generalmente debe usar Add(K, key, T Value)

Intente inspeccionar la clase con una herramienta que proporcione acceso de lectura a los metadatos. ILDASM para uno y puedes encontrar metadatos de los métodos explícitamente implementados.

+0

Me refiero a los metadatos. Estoy de acuerdo intellisense en no mostrar explícitamente implementado. –

+0

@luis pero luego está mal, es parte de los metadatos. –

+0

Solo puedo ver que Boolean declara implementar IConvertible pero no puedo ver los miembros de IConvertible en los metadatos en VS2010. ¿Puedes? –

Cuestiones relacionadas