2010-01-27 26 views
19

¿Crees que es mejor siempre hacer que los miembros protegidos de la clase sean una propiedad protegida implementada automáticamente para mantener el aislamiento o proteger el campo de protección es suficiente?Propiedad o campo protegido C#

protected bool test { get; set; } 

o

protected bool test; 

Respuesta

20

En general, se debe utilizar autoproperties - esto le permite agregar fácilmente la verificación, o cualquier otra cosa que necesite más adelante. Esto es especialmente importante si el miembro protegido será utilizado por clases fuera de su ensamblaje, ya que agregar dicho código no romperá su contrato con ellos, mientras que cambiar un campo a un método o propiedad sí lo hará.

+0

¿Cómo el uso de las propiedades automáticas facilita la tarea de agregar la verificación? – Rod

+5

Puede cambiar las propiedades automáticas a propiedades normales más adelante y agregar el código que desee, y las personas que usen su dll no tendrán que volver a compilar para usar los ensamblados actualizados. – thecoop

3

propiedad, respaldado por un campo privado.

This question podría ser útil

+0

¿Cuál es la ventaja real sobre un campo protegido? –

+1

encapsulación para uno, y la capacidad de romper el depurador cuando se accede también lo hace útil. –

+0

Una ventaja es la capacidad de realizar notificaciones de cambio de propiedad con, por ejemplo, INotifyPropertyChanged. En general, este enfoque (propiedad protegida respaldada por un campo privado) promueve la encapsulación, es decir, la ocultación de la información. No revele la implementación a menos que tenga una buena razón para hacerlo. (Supongo que la pregunta se centra en las propiedades protegidas porque se trata de una herencia.) – JMD

7

La práctica sugerida es hacen que sea una propiedad. La firma cambia dependiendo de si se trata de un campo o una propiedad, lo que puede causar problemas si cruza ensamblajes. Si lo convierte en una propiedad para empezar, nunca tendrá este problema. (a menudo más tarde desea agregar lógica cuando se lee o escribe la propiedad.)

En C#, la implementación automática de la propiedad es tan fácil, no hay ninguna razón para no hacerlo.

Además, deja las cosas más claras. Si realmente está destinado a ser utilizado por el mundo exterior como parte del funcionamiento del objeto, conviértalo en una propiedad. De lo contrario, un futuro programador podría preguntarse si hizo un campo protegido en lugar de privado por accidente.

3

Nunca debe permitir el acceso directo a una variable miembro desde fuera de su clase. Utilice una propiedad generada automáticamente o una propiedad con un campo de respaldo. Si permite el acceso directo, puede llevar a dolores de cabeza muy malos cuando varios métodos cambian ese valor en una cadena de derivación y no sabe cuál es el que está causando el error.

2

Sé que esta pregunta es antigua, pero la respondería en función del alcance del valor y de dónde debe inicializarse o escribirse. Intento usar el alcance más estrecho posible. Esperemos que lo siguiente aclare más sobre cómo decidir:

Valores protegidos: Esto supone que la clase base y/o la clase heredera solo necesitan acceder al valor, y no por ningún código externo. .

  1. Cuando la clase que hereda tiene que leer, pero nunca tiene que modificar el valor:

    • Si el valor se puede escribir una vez en el constructor de la clase base, utilice los siguientes, que impide la clase que hereda de escribir en él, y va un paso más allá y sólo permite que se establece en el constructor:

      protected readonly bool test;

    • Si el valor se puede escribir en un método diferente al constructor, pero solo en la clase base, use lo siguiente, lo que impide que la clase heredante lo escriba, pero le permite leer:

      protected bool Test { get; private set; }

  2. Cuando la clase que hereda puede modificar el valor, utilice el siguiente, lo que permite tanto la clase que hereda y la clase base para escribir en él en cualquier momento:

    protected bool test;

valores privados:. Esto supone que el valor sólo se necesita acceder desde dentro de la clase que se declara en

  1. Si sólo se puede establecer una vez en el constructor, utilice:

    readonly bool test;

  2. Si se puede establecer en cualquier lugar en la clase, utilizar:

    bool test;

Además, no hay que olvidar que si se declara como una propiedad, debe utilizar PascalCase. Si lo declaras como una variable miembro, debe usar camelCase. Esto facilitará que otros desarrolladores comprendan el alcance.

Cuestiones relacionadas