2009-05-20 17 views
5

En .NET propiedades se supone que son ciudadanos de primera clase sin embargo, en los IL captadores de propiedad de código y definidores se implementan como get_PropertyName y set_PropertyName.¿Por qué los ajustadores de propiedades y getters chocan con los métodos get_X y set_X?

class Property 
{ 
    int Value { get { return 42; } } 
    int get_Value() { return 6 * 9; } 
    void set_Value(int i) { } // Error even though Value is a read only property 
} 

Salida:

error CS0082: Tipo 'SO.Property' Ya se reserva un miembro llamado 'Get_Value' con los mismos tipos de parámetros

CS0082 de error: Tipo 'SO. Propiedad 'ya se reserva un miembro llamado' set_Value 'con los mismos tipos de parámetros

¿Por qué la des Los igners de .NET deciden usar un nombre que pueda entrar en conflicto con el código de usuario? Podrían haber usado un carácter ilegal (como Java usa $ para cosas internas).

+6

Los formatos get_Value() y set_Value() también van en contra de las Convenciones de nomenclatura de C# (http://msdn.microsoft.com/en-us/library/ms229045.aspx): "No utilice guiones bajos, guiones o cualquier otro personaje no alfanumérico ". Puede ser precisamente debido a este mismo problema, pero el punto es que no debe utilizar este formato en su código C#. – alastairs

Respuesta

8

Para los idiomas que no tienen el concepto de propiedades, como J # (que bien puede haber influido en la decisión de diseño), es necesario tener un nombre simple para llamarlos.

1

Buena pregunta: la mayoría de los miembros generados por el compilador (métodos y tipos anónimos) usan nombres que están garantizados para que no entren en conflicto con ningún miembro de su clase. Creo que esta instancia particular (así como los nombres generados para los métodos de eventos) es un caso en el que Microsoft cometió un pequeño error.

La única razón que puedo pensar que justificaría la decisión es que Microsoft puede haber esperado permitir que otros idiomas llamaran a estos métodos que no tienen un concepto o sintaxis de "propiedad".

+1

no tanto un error, fue deliberado. De hecho, esto hace que sea más fácil para los idiomas que no admiten la noción de propiedades llamarlos, también hace que sea fácil obtener el gettor o setter por reflexión. – Abel

2

Porque pueden necesitar ser llamados desde un código externo.

+0

Externo al CLR ??? – Motti

+1

No, "externo" a C# - vea la respuesta de Jb Evains –

7

El Common Language Specification (CLS) requiere el uso de los métodos get_ y set_ en el IL (decorado con bits especiales) cuando se implementan las propiedades. Esto es necesario para que diferentes compiladores (C#, C++ administrado, VB.NET, J #, IronPython, etc.) creen bytecodes interoperables.

Por lo tanto, los caracteres de subrayado son caracteres no "legales" en el sentido más amplio. No son compatibles con CLS y, por lo tanto, no deben utilizarse en interfaces no privadas.

Además, consulte este artículo sobre writing CLS-compliant code en MSDN.

Cuestiones relacionadas