2009-07-08 18 views
59
código

veces que he visto escrito así:¿Debe una propiedad tener el mismo nombre que su tipo?

public class B1 
{ 
} 

public class B2 
{ 
    private B1 b1; 

    public B1 B1 
    { 
     get { return b1; } 
     set { b1 = value; } 
    } 
} 

es decir, la clase B2 tiene una propiedad denominada "B1", que también es de tipo "B1".

Mi instinto me dice que esta no es una buena idea, pero ¿hay alguna razón técnica por la que deba evitar dar a una propiedad el mismo nombre que su clase?

(Estoy usando .net 2.0, en caso de que eso importe).

+0

Creo que las directrices de diseño de .NET framework también recomiendan esta convención de nomenclatura. – NotDan

+0

qué convención de nomenclatura: llamarlos de la misma manera o cambiar mayúsculas y minúsculas por diferenciación? – niico

Respuesta

55

Está bien. El ejemplo clásico aquí es

public Background { 
    public Color Color { get; set; } 
} 

hay cuestiones raras (casos extremos) que se presentan aquí, pero no lo suficiente como para justificar evitar este dispositivo. Francamente, creo que este dispositivo es bastante útil. Yo no disfrutar de no ser capaz de hacer lo siguiente:

class Ticker { ... } 


public StockQuote { 
    public Ticker Ticker { get; set; } 
} 

no quiero tener que decir Ticker StockTicker o Ticker ThisTicker etc.

+3

¿Cuáles son los casos de esquina? –

+10

'clase A {public static void Método (int i) {} public void Método (objeto o) {}}' y 'clase B {A A {get; conjunto; } public B() {A = new A(); Método A. (0); }} '. ¿'A.Method' llama al método estático llamado 'Método' o está llamando al método de instancia llamado' Método'? (En C# resulta que llamará al método estático. Sin embargo, si reemplaza el '0' en''A método (0) 'por' '¡Hola, mundo!' 'Llamará al método de instancia. Intellisense no recoge esto y resaltará la 'A' en 'Método A. ("¡Hola, mundo!') 'Azul como si fuera el método estático.) – jason

+2

Y esto es simplemente para señalar que no puede haber (raro) casos en los que la intención del código que utiliza este patrón no es clara (por supuesto, siempre hay una interpretación inequívoca basada en la especificación del idioma). – jason

10

Justo hoy, Eric escribió en su blog sobre el problema del 'Color de color'.

http://blogs.msdn.com/ericlippert/archive/2009/07/06/color-color.aspx

Personalmente, me gustaría evitarlo si es posible.

+3

¿Por qué? No veo ningún daño a eso. –

+1

@StevenSudit IMO agrega complejidad para el programador (después de todo, necesita leer ese artículo para comprender qué está pasando), y los programadores sabemos qué tan malo y propenso a errores es eso. Yo también lo evitaría. – MasterMastic

3

No hay problema técnico específico con él. Podría dañar o mejorar la legibilidad. De hecho, algunas bibliotecas de Microsoft tienen este tipo de propiedades (específicamente, con las propiedades enum, esto generalmente tiene sentido).

9

sólo puedo pensar en una desventaja. Si quería hacer algo como esto:

public class B1 
{ 
     public static void MyFunc(){ ; } 
} 

public class B2 
{ 
     private B1 b1; 

     public B1 B1 
     { 
       get { return b1; } 
       set { b1 = value; } 
     } 

     public void Foo(){ 
       B1.MyFunc(); 
     } 
} 

Habría que utilizar en su lugar:

MyNamespace.B1.MyFunc(); 

Un buen ejemplo de esto es el uso común es en la programación Windows Forms, donde los System.Windows. La clase Forms.Cursor se superpone con la propiedad System.Windows.Forms.Form.Cursor, por lo que los eventos del formulario tienen que acceder a los miembros estáticos que utilizan el espacio de nombres completo.

1

Obviamente puede ser un poco confuso cuando el nombre de una propiedad y su tipo son los mismos, pero aparte de eso no es realmente un problema.

Si el nombre tiene sentido, generalmente es mejor dejar que el nombre y el tipo sean los mismos. Si puede pensar en un nombre mejor, debe usarlo, pero no debe tratar de inventar un nombre a cualquier costo solo para evitar esta situación.

0

Doy a las cosas el mismo nombre que a su tipo, excepto en el caso: mis métodos y propiedades son "lowerCase"; y por lo tanto, no tendría el problema que tiene MiffTheFox.

public class B1 
{ 
    public static void myFunc(){ ; } 
} 

public class B2 
{ 
    private B1 m_b1; 

    public B1 b1 
    { 
     get { return m_b1; } 
     set { m_b1 = value; } 
    } 

    public void Foo() 
    { 
     B1.myFunc(); //this is Ok, no need to use namespace 
    } 
} 

Así que para mí, es m_b1 datos de los miembros, b1 es una propiedad (o una variable local o parámetro), y B1 es el nombre de la clase.

+3

Desafortunadamente el uso de minúsculas para Propiedades y Métodos está en conflicto directo con las pautas de nomenclatura aceptadas para C#. –

+0

Sí. Son pautas inferiores, OMI, ¿no estás de acuerdo? ¿Por qué llegaron a ser? – ChrisW

2

Otro gotcha es con tipos interiores.

me encuentro con éste todo el tiempo:

public class Car { 
    public enum Make { 
     Chevy, 
     Ford 
    }; 

    // No good, need to pull Make out of the class or create 
    // a name that isn't exactly what you want 
    public Make Make { 
     get; set; 
    } 
} 
+3

Es por eso que pluralizo mis nombres enum. Hay varios posibles 'Makes' of car, pero este auto tiene solo un' Make'. No siempre se lee mejor, pero lo que veo es que el enum es una lista de posible 'Hace'. –

1

Este patrón común es una de las razones por las que siempre uso this cuando se refiere a un miembro de instancia dentro de una clase. p.ej. Siempre

this.SomeMethod(this.SomeProperty); 

y nunca

SomeMethod(SomeProperty); 

En la mayoría de los casos, no hay ninguna ambigüedad real, pero me parece que ayuda a aclarar las cosas. Además, ahora sabe dónde se define la propiedad/método.

15

El Microsoft Naming Guideline for Members Estado:

considerar dar una propiedad del mismo nombre que su tipo.

Cuando tiene una propiedad que está fuertemente tipada a una enumeración, el nombre de la propiedad puede ser el mismo que el nombre de la enumeración. Por ejemplo, si tiene una enumeración llamada CacheLevel, una propiedad que devuelve uno de sus valores también puede ser llamada CacheLevel.

Aunque admito que hay una pequeña ambigüedad ya sea que solo estén recomendando esto para Enums o para propiedades en general.

Cuestiones relacionadas