2010-07-07 15 views
13

Entre estos dos:¿Por qué debería usar una propiedad implementada automáticamente en lugar de un campo?

Con propiedad:

class WithProperty 
{ 
    public string MyString {get; set;} 
} 

con el campo:

class WithField 
{ 
    public string MyString; 
} 

Al parecer, se supone que debo escoger la primera. ¿Por qué?

He escuchado el argumento de que el punto aquí es permitir cambios en la interfaz, pero si tengo el segundo y lo cambio al primero, ningún otro código debería tener que cambiar alguna vez. Cuando se recompila todo lo que va a apuntar a la propiedad en su lugar.

¿Falta algo importante aquí?

+0

podría estar relacionada: http://stackoverflow.com/questions/863182/changing-fields-to -property-is-a-breaking-change-under-what-scenarios – mmcdole

+8

Jon Skeet tiene un buen artículo sobre este tema: http://csharpindepth.com/Articles/Chapter8/PropertiesMatter.aspx – Odrade

Respuesta

19

La diferencia más importante es el hecho de que si usa un campo y luego necesita cambiarlo a una propiedad (por ejemplo, para aplicar alguna validación), todas las bibliotecas que invocan su código deberán ser recompiladas. Es cierto que puede compilar exactamente el mismo código si el nombre permanece igual, pero los consumidores de su código aún tendrán que volver a compilarse. Esto se debe a que el IL generado para obtener el valor es diferente entre un campo y una propiedad. Si ya es una propiedad, puede realizar un cambio sin forzar a los consumidores de su código a cambiar.

Esto puede o no ser un problema para usted. Pero la propiedad tiene casi la misma cantidad de código y se considera la mejor práctica. Siempre iría por la propiedad.

+1

Yo también. Simplemente me pongo. Me gusta seguir "lo que hace la multitud" sin entender por qué :) –

9

La propiedad se puede cambiar más adelante si necesita agregar validación u otra lógica sin romper otros ensambles.

Además, la propiedad puede utilizarse con enlace de datos.

0

Con una propiedad, puede extender fácilmente para incluir nueva lógica.

Por ejemplo, si necesita agregar lógica de validación al set.

+0

Sí, pero no puedo hacer t sombrero igual de simple con el campo. Convertir la propiedad en el campo no es un cambio sintáctico en ninguno de los códigos de llamada. Si necesito esa lógica, entiendo que debe ser una propiedad. Estoy preguntando sobre casos en los que no. –

2

La parte importante se echa en falta es la gravedad de esta declaración:

Cuando vuelve a compilar

Cuando su punto de código a un campo y lo cambia a apuntan a una propiedad de la misma nombre, el C# en sí mismo no cambia, pero el IL resultante lo hace; genera una llamada de método al captador o instalador, según corresponda.

No todas las aplicaciones tienen todas sus piezas en una sola unidad distribuida. Muchas aplicaciones dependen de las interfaces para la capacidad de conexión/capacidad de expansión. Si tiene una aplicación con una interfaz para un campo y desea cambiarla a una propiedad para aprovechar el poder de las propiedades, la aplicación debe ser recompilada y redistribuida. Es mejor que lo conviertas en una propiedad en primer lugar.

Cuestiones relacionadas