105 votos

La diferencia entre la Propiedad y el Campo en C# 3.0+

Me doy cuenta de que parece ser un duplicado de Lo que es la diferencia entre un campo y una propiedad en C#? pero mi pregunta tiene una ligera diferencia (desde mi punto de vista):

Ahora que en C# 3.0 puedo declarar una propiedad como esta:

public string MyString { get; set; }

teniendo en cuenta que el compilador hace algo como la creación del campo privado (AFAIK) ¿cuál es la diferencia entre la declaración anterior y:

public string myString;

?

Edit: yo probablemente no se explicar lo que quiero decir muy bien.

Una vez que sé que no quiero usar mi clase con "las técnicas que sólo funciona en propiedades" y no tengo la necesidad de validación y desea utilizar público get/set

existe diferencia alguna (a excepción de el/estilo de desarrollo futuro) -como algún tipo de control en la configuración de la propiedad ?

118voto

Brian Rasmussen Puntos 68853

Campos y propiedades de la misma apariencia, pero no lo son. Propiedades métodos y, como tal, hay ciertas cosas que no son compatibles para las propiedades, y algunas cosas que puede suceder con propiedades, pero nunca en el caso de los campos.

Aquí está una lista de diferencias:

  • Los campos pueden ser usados como datos de entrada out/ref argumentos. Propiedades de mayo no.
  • Un campo siempre producirá el mismo resultado cuando se le llama varias veces (si dejamos fuera los problemas con múltiples hilos de ejecución). Una propiedad como la DateTime.Ahora no es siempre igual a sí mismo.
  • Propiedades pueden lanzar excepciones, los campos nunca se hacer eso.
  • Las propiedades pueden tener efectos secundarios o tomar un tiempo muy largo para que lo ejecute. Los campos no tienen efectos secundarios y siempre será tan rápido como se puede esperar para el tipo dado.
  • Propiedades de apoyar a los diferentes accesibilidad para los getters/setters - campos no (pero los campos pueden ser hechas readonly)
  • Cuando el uso de la reflexión de las propiedades y los campos que se tratan de manera diferente, MemberTypes por lo que se encuentran de manera diferente (GetFields vs GetProperties por ejemplo)
  • El Compilador JIT puede tratar de acceso a la propiedad de manera muy diferente en comparación con acceso al campo. Sin embargo, puede compilar abajo a idéntico código nativo pero el alcance de la diferencia está ahí.

91voto

Mark Ingram Puntos 24995

La encapsulación.

En la segunda instancia que acaba de definir una variable, en el primero, hay un getter / setter alrededor de la variable. Así que si usted decide que usted desea validar la variable en una fecha posterior será mucho más fácil.

Además de que se muestran de forma diferente en Intellisense :)

Edit: Actualización para OPs actualizado pregunta - si usted desea ignorar las sugerencias aquí, la otra razón es que simplemente no es buena OO diseño. Y si no tienes una muy buena razón para hacerlo, siempre elegir una propiedad de más de una variable pública / campo.

37voto

Dustin Campbell Puntos 6323

Un par rápida, las diferencias obvias

  1. Una propiedad puede tener palabras clave descriptor de acceso.

    public string MyString { get; private set; }
    
  2. Una propiedad puede ser reemplazado en los descendientes.

    public virtual string MyString { get; protected set; }
    

13voto

AnthonyWJones Puntos 122520

La diferencia fundamental es que un campo es una posición en memoria donde los datos del tipo especificado se almacena. Una propiedad representa una o dos unidades de código que se ejecuta para recuperar o establecer un valor del tipo especificado. El uso de estos métodos de descriptor de acceso es sintácticamente oculto mediante el uso de un miembro que parece comportarse como un campo (en el que pueden aparecer en cualquiera de los lados de una operación de asignación).

6voto

Frederik Gheysels Puntos 36354

La primera de ellas:

public string MyString {get; set; }

es una propiedad; la segunda ( public string MyString ) indica un campo.

La diferencia es, que ciertas técnicas (ASP.NET enlace de datos para los casos), sólo funciona en propiedades, y no en los campos. Lo mismo es cierto para la Serialización XML: sólo son propiedades de la serie, los campos no son serializados.

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X