2010-03-12 6 views
11

Desde el C# convención estándar es capitalizar la primera letra de las propiedades públicas, el viejo C++ convención del capital inicial de nombres de tipos, y en minúscula inicial de nombres no son de tipo no impide la colisión de nombres clásico en el que los más evidentes coincidencias de nombre de objeto el nombre del tipo:¿Cómo se resuelve la colisión de nomenclatura común entre tipo y objeto?

class FooManager 
{ 
    public BarManager BarManager { get; set; } // Feels very wrong. 
               // Recommended naming convention? 
    public int DoIt() 
    { 
     // 1st and 2nd Bar Manager are different symbols 
     return BarManager.Blarb + BarManager.StaticBlarb;                   
    } 
} 

class BarManager 
{ 
    public  int Blarb { get; set; } 
    public static int StaticBlarb { get; set; } 
} 

Parece compilar, pero se siente tan mal. ¿Existe una convención de nomenclatura recomendada para evitar esto?

+0

'foo' no se define en cualquier lugar. Creo que querías decir 'BarManager'. –

+0

Solucionado. ¡Gracias! – Catskul

Respuesta

7

Tener un tipo y una propiedad con el mismo nombre exacto no es infrecuente. Sí, parece un poco raro, pero las propiedades de cambio de nombre para evitar este choque se ven aún más extrañas, en verdad.

Eric Lippert tenía a blog post on this exact topic.

no hay ambigüedad para el compilador, sin embargo.

+0

Las publicaciones de blog realmente señalan por qué en otros idiomas a menudo es ilegal y existe ambigüedad en el lenguaje en sí. La resolución de la colisión del nombre no resuelve la ambigüedad porque C# llamará a los métodos estáticos a través de la instancia que parece ser una razón por la cual la convención de capital inicial es razonable en C#/.net Me gusta su respuesta, pero creo que la ambigüedad la publicación del blog también debe abordarse. – Catskul

+0

@Catskul, Lo único que colisionaría son propiedades estáticas realmente. Y no hay razón para usar propiedades estáticas. Los métodos no colisionarán (ya que tendrá que usar "()" cuando llame a un método). –

+0

@Mattias echa un vistazo a esa publicación del blog. Habla sobre cómo una "Impresión (cadena) estática" podría causar un problema si también hay una "Impresión (objeto)". – Catskul

1

El C# convención, se nombra propiedades en la misma forma que usted nombra sus clases. La razón por la que siente que está mal es porque proviene de un entorno diferente. Pero si lo usa por un tiempo, aprenderá que no le causa ningún problema y se sentirá bastante natural cuando esté acostumbrado. No hay lugar cuando colisionará de ninguna manera. Yo (como desarrollador de C#) siento que la convención de la letra inicial minúscula para las propiedades se siente mal. Solo tienes que acostumbrarte.

1

estoy de acuerdo con esto, honestamente - si sus métodos estáticos/miembros no son, evidentemente, estática por su nombre y por fin, que tienes problemas más grandes que la colisión de nombres.

+0

* "si sus métodos/miembros estáticos no son obviamente estáticos por nombre y por propósito, usted tiene problemas más grandes que la colisión del nombre." * Estoy de acuerdo con esto en su mayor parte, pero creo que no hay espacio para esto no ser el caso el 100% del tiempo. – Catskul

1

No creo que haya causado ningún problema para mí. Los siguientes son convenciones generales, para Propiedades. Lo único que podría ser helpfulgetting used a éstos ....

  • Pascal caso, no subrayados.
  • Trate de evitar las abreviaturas.
  • Los miembros deben diferir en más de caso de ser utilizable a partir de mayúsculas y minúsculas lenguajes como Visual Basic .NET.

qué: Esta convención es consistente con .NET Framework y es fácil de lectura. como

public int RecordId

referencia: NET Programming Standards and Naming Conventions

También puedes ver esto: General Naming Conventions

0

que se CAVIAT esto diciendo, no me importa la colisión, ya que el compilador puede trabajar hacia fuera . Sin embargo , en el espíritu de ofrecer otras soluciones que he visto, y dejando que otros decidan por mí mismo ... Creo que aquí es donde el patrón feo (para mí) de utilizar mi * surgió.

Por ejemplo:

public class Foo { /* ... */ } 

public class Bar 
{ 
    public Foo MyFoo { get; set; } 
    // ... 
} 
Cuestiones relacionadas