2009-07-13 24 views
8

Ya leí el artículo de MSDN al respecto. Parece que internamente es la forma en que C# establece cuál es la función que funcionará como indexador (¿estoy en lo cierto?). Ahora, he visto el siguiente ejemplo:DefaultMemberAttribute: ¿qué hace?

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

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

Ahora, no entiendo lo que significa.


Gracias a todos. Pero todavía no puedo obtener su utilidad, aparte de la cosa del indexador. ¿Cuándo vamos a llamar a InvokeMember?

+0

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

Respuesta

5

Personalmente, nunca lo he usado, pero, por lo que puedo decir, está definiendo el método predeterminado que se invocará al llamar al InvokeMember. Por lo tanto, utilizando el fragmento de código que ya ha proporcionado si yo iba a decir:

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

porque dejé el primer argumento vacío de la InvokeMember llamarlo utilizaría el atributo para determinar lo que el miembro predeterminado es de la clase, en su caso es Main.

1

El atributo DefaultMemberAttribute define el miembro predeterminado al que se llama cuando se llama a InvokeMember con una cadena vacía como primer argumento.

Si usted lee la documentación de MSDN para InvokeMember, que explícitamente dice:

Parámetros
nombre
Tipo: System.String
La cadena que contiene el nombre del constructor, método, propiedad , o miembro de campo para invocar.
-o--
Una cadena vacía ("") para invocar al miembro predeterminado.

El miembro predeterminado será el declarado por el atributo DefaultMemberAttribute.

9

No, el DefaultMemberAttribute es utilizado por los idiomas como VB.NET para averiguar el miembro que se actúa de manera predeterminada si ningún miembro se hace referencia de un objeto, es decir, el miembro invocado por InvokeMember. Esto se usa a menudo junto con los indexadores, como ha notado, pero C no lo usa directamente (a menos que use InvokeMember explícitamente).

Sin embargo, para el beneficio de otros lenguajes .NET, C# emiten la DefaultMemberAttribute para el indexador de una clase (si tiene uno), según lo indicado por MSDN:

El compilador de C# emite la DefaultMemberAttribute en cualquier tipo que contenga un indexador. En C# es un error para atribuir manualmente un tipo con DefaultMemberAttribute si el tipo también declara un indizador.

Creo que MSDN confunde las cosas al referirse a los indexadores mucho en los comentarios, pero luego da un ejemplo que no utiliza un indexador. Para aclarar, el miembro predeterminado puede ser cualquier cosa, pero C# otorga un comportamiento especial para los indexadores al emitir el atributo por usted (si existe un indexador) a excepción de todos los demás casos de uso.