2011-02-01 13 views
6

Solo preguntando ...¿Hay alguna razón para no usar las propiedades 'protegidas'?

¿Hay alguna razón para no usar las propiedades protegidas?

quiero decir en lugar de utilizar esto:

public abstract class Foo 
{ 
    protected Bar { get; private set; } 
} 

de usar éste:

public abstract class Foo 
{ 
    private Bar _bar; 

    protected Foo(Bar bar) 
    { 
     _bar = bar; 
    } 

    protected GetBar() 
    { 
     return _bar; 
    } 
} 
+7

La segunda es Java perfectamente válida; así que si ve un código C# así, la razón más probable es que haya sido escrito por un programador Java que aún no se ha adaptado a C#. –

+2

Usted usa 'protected' para accesibilidad, no tiene nada que ver con las propiedades. – leppie

Respuesta

9

No veo ninguna razón por la que utilizaría un método en lugar de una propiedad independientemente de GetXXX() son modificadores.

Dado que etiquetó esta pregunta con la etiqueta C#, recomiendo estrictamente usar la primera aproximación. Para eso están las propiedades.

Utilice un método solo cuando el valor devuelto por él puede ser diferente cada vez que lo llame, independientemente de su estado. Por ejemplo, DateTime.Now fue un error y debería haber sido un método.

Para obtener más información, consulte la propiedad Usage Guidelines on MSDN. En una nota lateral, es sorprendente cómo no han tenido la necesidad de cambiarlo desde Framework 1.1.

+1

Como se mencionó anteriormente por ammoQ, es probable que sea un código portado desde Java o un programador de Java, ese es el estándar en Java. –

+0

No es obligatorio que una propiedad sea idempotente. Solo debe ser "puro" sin efectos secundarios. – leppie

+0

@leppie: Si observa las pautas, hay una en la lista cuando se deben usar métodos que dicen 'Llamar al miembro dos veces seguidas produce resultados diferentes'. Por supuesto, también menciona que no tiene efectos secundarios. – decyclone

0

Sólo si tiene atributos no modificables o no legibles dentro de la clase

+0

Por favor, elabore, su respuesta no está clara en absoluto. – leppie

1

Unas cuantas más razones para usar propiedades en lugar de los métodos: la unión

  • datos sólo se pueden ver las propiedades
  • Usted puede usar semántica solo lectura o solo escritura.
0

La pregunta no es realmente acerca de protected tiene más con: ¿por qué debería usar propiedades?

Propeties son lógicamente equivalentes con Getter pares de método/organismo, lo que puede hacer con un con un Name {get{} \ set{}} que puede hacer con un GetName() \ SetName() par y viceversa, especialmente en lo que C# tiene get y set descriptores de acceso, por lo que pueden jugar con el accesibilidad también

Pero, hay algunas personas que sienten que las propiedades públicas (o protegidas) son un poco como copiar desde una perspectiva OOP, especialmente si todo lo que hace la propiedad es simplemente exponer un campo de respaldo. Después de todo, person.Name = "SWeko" parece que cambia el estado del objeto externamente, mientras que person.SetName("SWeko") simplemente le dice al objeto que necesita cambiar su estado. Y desde un punto de vista puramente teórico, creo que esas objeciones tienen sus méritos.

Sin embargo, no todos tenemos el lujo de vivir en torres de marfil, por lo que el concepto de propiedades es realmente útil, ya que es más legible, menos propenso a errores y en mi humilde opinión, más cercano al modelo real. También nos proporciona una especie de dicotomía, cuando escribo algo como esto:

person.Name = "SWeko"; 
person.Work(); 

espero que la primera línea será una tarea rápida, y no tienen efectos secundarios, mientras espero que la segunda línea hará algo más, y probablemente afecte el estado interno del objeto.Cuando uso el método Getter y Setter, ninguna distiction es inmediatamente obvia:

person.SetName("SWeko"); 
person.Work(); 
+0

En mi humilde opinión, las propiedades de lectura y escritura deben comportarse como variables. Si un objeto implementa algunas propiedades de lectura-escritura, escribirlas y luego leerlas en cualquier orden sin intervención * de las llamadas al método * debería hacer que recuperen los valores escritos. No tengo problemas con las propiedades de escritura que cambian los valores de las propiedades de solo lectura, o con las llamadas a métodos que cambian los valores de cualquiera o todas las propiedades (solo lectura o lectura y escritura), pero no me gusta la lectura/escritura interconectada de lectura y escritura propiedades. En mi humilde opinión, algo así como StringBuilder.Length debe ser una propiedad de solo lectura, junto con un método SetLength. – supercat

+0

@supercat Esto sería muy tedioso al trabajar con controles de IU, ya que tienden a tener muchas propiedades que dependen una de la otra de una manera lógica y esperada (por ejemplo, el tamaño automático afecta a las propiedades de ancho y alto). – SWeko

+0

@SWeko: Un paradigma que creo que falta en partes de Forms, y que ayudaría a mejorar su utilidad, es la separación de las propiedades de "configuraciones" del "comportamiento actual". Por ejemplo, "Visible" debe dividirse en "Visibilidad solicitada" e "IsShown". La "Visibilidad solicitada" debe ser una propiedad de lectura-escritura que siempre devolverá el valor escrito; "IsShown" debe ser una propiedad de solo lectura que indique si el control y todos sus padres tienen establecido el valor de RequestedVisibility. Para el dimensionamiento, debe haber propiedades solicitadas de tamaño y de tamaño real, la primera de lectura y escritura la última de solo lectura. – supercat

Cuestiones relacionadas