2012-01-07 15 views
7

Duplicar posible:
Difference between Property and Field in C#C# terreno frente a la propiedad

pensé que las propiedades básicas ({ get; set; }), donde los mismos que los campos públicos, con sólo la ventaja de ser capaz de cambiar ellos sin romper la compatibilidad binaria. Siguiendo la respuesta que obtuve aquí, https://stackoverflow.com/a/8735303/331785, descubrí que también existe una desventaja para las propiedades. No se puede acceder a ellos por referencia si son de un tipo de valor. ¿Por qué es esto y qué otras diferencias hay?

+0

aquí tienes la respuesta: http://stackoverflow.com/questions/653536/difference-between-property-and-field-in-c-sharp –

+5

Eso es una falacia. No se puede acceder a las propiedades por referencia, punto. Has cometido el error común de confundir el paso de referencia con los tipos de referencia. – Noldorin

+1

Es decir, la referencia de un tipo de referencia se pasa por valor de forma predeterminada. Pasar por referencia siempre se hace con la palabra clave 'ref' o' out', para los tipos de referencia y de valor. – diggingforfire

Respuesta

14

Descubrí que también hay una desventaja para las propiedades. No se puede acceder a ellos por referencia si son de un tipo de valor. ¿Por qué es esto

Porque bajo las sábanas, una propiedad es solo un método. Si miras el IL, verás métodos como get_PropertyName y set_PropertyName. El problema con eso es que para poder trabajar con referencias, necesitarás poder devolver una referencia para un método.

public ref T MyProperty 
{ 
    get 
    { 
     return ref _underlyingField; 
    } 
} 

Por supuesto, es something entirely possible in the CLR; pero no expuesto por el lenguaje C#.

Aunque es posible, el CLR necesita algunos ajustes para mantenerlo como verificable. La sintaxis de la propiedad debería ser soportada por.

Sin embargo, es cualquiera de ese útil? Como dijiste, un campo puede hacerlo. Si lo necesitas; usa un campo Respaldarlo tomaría mucho trabajo. Probablemente haya muy pocos casos en que sea apropiado; y crearía muchos casos donde el uso de un campo podría haber sido mejor en primer lugar.

4

Las propiedades son solo la sintaxis del revestimiento de azúcar para un método getX() y setX(). Se ve y actúa como un campo, pero en realidad son solo dos métodos. La razón por la que se agregó la propiedad automática fue para evitar la repetición de tener que crear un campo y crear un getter y setter estándar para la propiedad, y para que sea mucho más simple permitir el cambio de la implementación sin cambiar la interfaz.

La razón por la cual no se puede acceder a ellas por referencia si son un tipo de valor es porque los tipos de valores generalmente están en la pila y porque solo está llamando a un método. El getter en la propiedad debe ser llamado y el valor devuelto debe ser empujado en la pila antes de que pueda ser referenciado.

+6

-1 para propagar el mito de los tipos de valores que están en la pila (incluso con el "en general"). Si la propiedad (o campo) es de una clase, * no * estará en la pila. –

+0

@JonSkeet Creo que está hablando sobre el valor de retorno del getter, que primero terminará en un registro, y luego probablemente en la pila para obtener una dirección a la que se puede hacer referencia. – CodesInChaos

Cuestiones relacionadas