2009-05-28 21 views
15

This stackoverflow question tiene una interesante discusión sobre la forma de evitar dar enumeraciones y las propiedades de los mismos nombres para que usted no tiene un código como éste:¿Se recomienda sumar todas las enumeraciones C# con "Enum" para evitar conflictos de nombres?

public SaveStatus SaveStatus { get; set; } 

Parece que la respuesta aceptada sugiere el uso de "Estado" de la enumeración y "Estado" para la propiedad:

public SaveStatus SaveState { get; set; } 

Pero creo que esto es difícil de leer y no inmediatamente claro qué es lo que.

Dado que esta enumeración nombrar problema es un problema constante, estoy considerando simplemente siempre sufijo mis enumeraciones con "enumeración" por lo que tendría esto:

public SaveStatusEnum SaveStatus { get; set; } 

SaveStatus = SaveStatusEnum.Succeeded; 

alguien hace esto? Feliz con eso? Resolvió este problema de otra manera?

+0

Uno de los puntos de MS IDE para desarrollar en DOTNET es eliminar problemas como este. Incluso diría que el IDE es una parte integral de DOTNET. –

+1

Hago eso y estoy contento con eso. Solía ​​evitarlo, pero me causaba problemas en el código real. Cuando observa una línea de código, parece razonable tener SaveStatus SaveStatus {get; conjunto; }. Cuando estás en una clase con cientos de líneas y resharper sigue confundiendo a los dos, es molesto y confuso. – JohnOpincar

+1

Sí, pero ese es un error de ReSharper, no es un problema de Visual Studio o un compilador. Dile al equipo ReSharper que solucione su error. http://www.jetbrains.net/jira/browse/RSRP-83171 –

Respuesta

22

Desde el MSDN page for Property naming guidelines:

considerar la creación de una propiedad con el mismo nombre que su subyacente tipo. Por ejemplo, si declara una propiedad llamada Color, el tipo de , la propiedad también debe ser Color.

Me tomo como un "no" :)

Editar:

si no le gusta usar el nombre completo dentro de la clase que declara la propiedad, se puede trabajar alrededor de ella:

using SaveStatusEnum = MyNamespace.SaveStatus; 
... 
SaveStatus = SaveStatusEnum.SomeValue; 

esa manera se puede mantener el nombre de enumeración sin el sufijo, y limitar la rareza de nombres para sólo esa clase. :)

+0

Sí, pero esto causa conflictos de nombres cuando tengo la enumeración en mi archivo de clase. Siempre tengo que usar el espacio de nombre completo cuando quiero la enumeración, ya que VisualStudio intellisense siempre piensa que me refiero a la propiedad. SaveStatus = TestingDelegateCommandSave.ViewModels.SaveStatus.NotApplicable; –

+0

OK, retiro eso, funciona con intellisense (tenía un viejo código Enum allí). Bonito. Esta fue la respuesta que estaba buscando, algo decisivo. Estoy nombrando mis enums lo mismo que mis propiedades de aquí en adelante. –

+0

En realidad, el compilador también puede quejarse, simplemente probé con un ejemplo en mi proyecto de la vida real. Si eso sucede, puede solucionarlo con una declaración using (actualicé mi respuesta con un ejemplo). – Rytmis

6

¿El .NET Framework usa Enum como sufijo? No. Es por eso que tampoco lo uso.

En su lugar, uso palabras como Opción (u Opciones si es un Flags-Enum), Modo o similar.

public SaveStatusMode SaveStatus { get; set; } 
public SaveStatusOption SaveStatus { get; set; } 
public SaveStatusVariant SaveStatus { get; set; } 
6

directrices de nombres de .NET de Microsoft no dan cualquiera de dichas recomendaciones.

¿Por qué evitaría dar enumeraciones y propiedades con los mismos nombres? Este:

public SaveStatus SaveStatus { get; set; } 

funciona bien, es fácil de leer, y es muy visible y utilizable.

+0

Pero luego en mi constructor tengo que tener un gran calificador de espacio de nombres: SaveStatus = TestingDelegateCommandSave.ViewModels.SaveStatus.NotApplicable; de lo contrario, intellisense piensa que me refiero a "SaveStatus" la propiedad. Tengo la enumeración definida en mi archivo de clase, ya que solo se usa para mi clase, por lo tanto, el conflicto de nombres con la propiedad es el motivo por el que estoy buscando otra convención para nombrar enumeraciones, para evitar esto. –

+0

Utilizo SaveStatus SaveStatus todo el tiempo. Dado que el uno es una propiedad, creo que es más fácil de leer que cambiar el nombre a SaveState. Nunca usaría las enum cosas. –

+0

@Edward: No, no necesita un calificador de espacio de nombres, al menos no en C#. "SaveStatus = SaveStatus.NotApplicable" funciona bien. –

4

Se usa un tipo de sufijo para algunos tipos de clases, como xxxException y xxxAttribute, pero los sufijos no se usan ampliamente. Por ejemplo, una clase que implementa IEnumerable no se llama MyListEnumerableClass, sino solo MyList.

En lugar de inventar un sufijo estándar que atormenta los nombres, intente inventar nombres que tengan sentido en la situación concreta.

1

Si definir la propiedad de la manera en que la tiene, seguramente no importa si los nombres son iguales o no. Diría que probablemente sea más claro usar de esa manera.

1

Sé que mi sugerencia va en contra de las convenciones de nomenclatura .NET, pero personalmente prefijo enumeraciones con 'E' y enum flags con 'F' (similar a cómo prefijamos las interfaces con 'I'). Realmente no entiendo por qué esta no es la convención. Los Enum/Flags son un caso especial, como interfaces que nunca cambiarán su tipo. No solo deja en claro lo que es, es muy fácil escribir en intellisense ya que el prefijo filtrará la mayoría de los otros tipos/variables/etc., y no tendrá estos conflictos de nombres.

Y eso también resolvería otro problema donde para ejemplos en WPF utilizan clases estáticas como enumeraciones (por ejemplo, FontWeights) que tienen instancias predefinidas de tipos pero no sabría si no las busca. Si acaban prefijos con 'E', todo lo que tendrías que hacer es escribir el carácter para encontrar estas clases estáticas especiales.

0

Recomiendo las pautas de MS. Y siempre es una codificación fea leer algo como 'FooEnum' en el código;)

Cuestiones relacionadas