2010-02-17 12 views
142

Tengo una clase que utiliza una enumeración, la enumeración está actualmente en su propio archivo que parece un desperdicio.¿Las enumeraciones en C# tienen su propio archivo?

¿Cuál es la opinión general sobre las enumeraciones que se colocan dentro del espacio de nombres de un archivo en el que se consumen? ¿O debería la enumeración realmente vivir en su propio archivo cs?

Editar

Debo mencionar que, si bien la clase en cuestión utiliza estas enumeraciones, lo mismo ocurre con las llamadas externas. En otras palabras, otra clase puede establecer estas enumeraciones. Por lo tanto, no se usan internamente para la clase, de lo contrario, esta pregunta sería obvia.

+70

Si usó números mágicos, no tendría este problema en absoluto. – MusiGenesis

+7

¿Debería ser wiki de la comunidad? No hay una respuesta correcta ni consideraciones técnicas reales aparte de las capacidades de IDE. –

+1

Aún pueden estar en el mismo espacio de nombres, incluso si están en archivos diferentes. Si está haciendo la pregunta secundaria de si crear un espacio de nombres .Enums Y un archivo nuevo, entonces diría que, por lo general, no. Pero, de lo contrario, podría entender mal los espacios de nombres y debería leer sobre ellos (no mucho para ellos, solo un mecanismo de organización) –

Respuesta

77

No diría "derrochador" (¿cuánto cuesta un archivo adicional?), Pero a menudo es inconciente. Por lo general, hay una clase que está más estrechamente relacionada con la enumeración, y las pongo en el mismo archivo.

+6

Agrega ruido al directorio cuando se navega, eso es lo que quise decir con desperdicio. – Finglas

+88

@Finglas - ¡el ruido de una persona es la señal de otra persona! –

+2

Por lo general, hay una clase que está más estrechamente asociada. Pero si eso cambia, si alguien llega a la vez decide tomar una dependencia de la enumeración, entonces es hora de un refactor. –

53

Esto es completamente una cuestión de estilo. Lo que suelo hacer es tener un archivo llamado Enums.cs en la solución en la que se recopilan las declaraciones enum.

Pero generalmente se encuentran a través de la clave F12 de todos modos.

+4

Creo que esta es probablemente la mejor opción, ya que: 1) es sólo un archivo en lugar de muchos que podría ser considerado como que saturan el directorio 2) está claro lo que está contenido dentro del archivo 3) medios que sabes dónde encontrar un 'enum' en lugar de estar en un archivo que contiene una clase que está relacionada pero no _necesariamente_ la única clase que lo usa –

+3

No me gusta esto. Como se dice en la respuesta de James Curran, las enumeraciones tienen una relación principalmente con las clases. Al ponerlos todos en un único archivo global, ni siquiera están en un directorio (para un espacio de nombres secundario) donde podrían pertenecer temáticamente. –

+2

Sí @DebugErr, estoy de acuerdo contigo. Desde que esta respuesta se publicó en 2010, he cambiado entre varios enfoques y tiendo a ir con un archivo por tipo, o declarando enumeraciones en el mismo archivo que la clase relacionada. –

59

Esto es solo una cuestión de preferencia.

Prefiero poner cada enumeración en su propio archivo (igualmente para cada interfaz, clase y estructura, sin importar cuán pequeña sea). Los hace más fáciles de encontrar cuando vengo de otra solución o si no tengo una referencia al tipo en cuestión.

Poner un solo tipo en cada archivo también hace que sea más fácil identificar los cambios en los sistemas de control de fuente sin diferir.

+8

"Poner un solo tipo en cada archivo también facilita la identificación de cambios en los sistemas de control de fuente sin diferir". El miedo a diferir no debe formar la base de sus decisiones de diseño. Incluso diría que cualquiera que no sepa cómo diferir correctamente un archivo en el control de fuente no está realmente utilizando el control de fuente en absoluto. – Dan

1

Me gusta tener un archivo de enumeraciones público llamado E que contenga cada enum separada, luego se puede acceder a cualquier enumeración con E ... y están en un solo lugar para administrar.

9

Generalmente prefiero que mis enums estén en el mismo archivo que la clase de la que probablemente sea un atributo. Si, por ejemplo, tengo una clase Task, entonces la enumeración TaskStatus estará en el mismo archivo.

Sin embargo, si tengo enumeraciones de naturaleza más genérica, las guardo contextualmente en varios archivos.

7

Creo que eso depende del alcance de la enumeración. Por ejemplo, si la enumeración es específico de una clase, por ejemplo, utiliza para evitar el escenario constante mágica, entonces yo diría que lo puso en el mismo archivo que la clase:

enum SearchType { Forward, Reverse } 

Si la enumeración es general y puede ser utilizado por varias clases para diferentes escenarios, entonces me inclino a usar ponerlo en su propio archivo. Por ejemplo el siguiente podría ser utilizado para varios propósitos:

enum Result { Success, Error } 
5

que tienden a poner las enumeraciones en su propio archivo por una razón muy simple: al igual que con las clases y estructuras, es bueno saber exactamente dónde buscar si desea encontrar una definición de tipo: en el archivo del mismo nombre. (Para ser justos, en VS también puede usar "Ir a definición")

Obviamente, puede salirse de control.Un colega donde trabajo incluso hace archivos separados para los delegados.

17

Coloco mayormente dentro en el espacio de nombres y fuera de la clase para que sea de fácil acceso otras clases en ese espacio de nombres como a continuación.

namespace UserManagement 
{ 
    public enum UserStatus { Active, InActive } 
    class User 
    { 
     ... 
    } 
} 
+0

Wow. No he sabido que las enumeraciones se puedan colocar directamente en el espacio de nombres. Voy con esta respuesta. Dentro de mi estructura MVC se colocarán dentro del controlador lo que me hace lógica. Gracias por esto. Upvoted. – C4u

35

La pregunta que debe hacerse sería: ¿hay algo acerca de un tipo de enumeración en C# que indica que debería tratar de forma diferente a todos los otros tipos de crear?

Si la enumeración es pública, se debe tratar como cualquier otro tipo de público. Si es privado, grábelo como un miembro anidado de la clase que lo usa. No hay una razón convincente para poner dos tipos públicos en el mismo archivo simplemente porque uno es una enumeración. El hecho de que sea un tipo público es todo lo que importa; el sabor del tipo no.

5

Una ventaja de utilizar un archivo separado para enumeraciones es que puede eliminar la clase original que utilizó la enumeración y escribir una nueva clase utilizando la enumeración.

Si la enumeración es independiente de la clase original, colocarla en un archivo separado facilita los cambios futuros.

19

Otra ventaja de poner cada tipo (clase, estructura, enumeración) en su propio archivo es el control de fuente. Puede obtener fácilmente toda la historia del tipo.

7

Depende de qué acceso se necesita.

Si el enum solo lo usa una sola clase, está bien declararlo dentro de esa clase porque no necesita usarlo en ningún otro lado.

Para las enumeraciones utilizadas por varias clases o en una API pública, siempre mantendré la definición en su propio archivo en el espacio de nombre apropiado. Es mucho más fácil de encontrar de esa manera, y la estrategia sigue el patrón de un objeto por archivo, que también es bueno usar con clases e interfaces.

5

Si está utilizando el complemento USysWare File Browser para Visual Studio, puede encontrar muy rápidamente archivos de nombres particulares en su solución. Imagine que busca una enumeración que no está en su propio archivo sino que está enterrada en algún archivo en una solución gigantesca.

Para soluciones pequeñas, no importa, pero para las grandes, se vuelve aún más importante mantener las clases y las enumeraciones en sus propios archivos. Puede encontrarlos rápidamente, editarlos y más. Recomiendo encarecidamente poner tu enumeración en su propio archivo.

Y como se dijo ... ¿Qué desperdicio es un archivo que termina siendo solo un par de kb de todos modos?

+0

Utilizo ese complemento también, es bastante útil. Pondría enumeraciones en sus propios archivos, sin importar si la solución es grande o pequeña. –

0

Si tiene múltiples proyectos en una solución. Entonces mejor crea otro proyecto Utilities. A continuación, cree una carpeta \Enumerations y cree un static class anidado. Y luego asigne cada clase estática donde creará enumeración que corresponda al nombre de sus proyectos. Por ejemplo, usted tiene un proyecto llamado DatabaseReader y DatabaseUsers entonces usted puede nombrar la clase estática como

public static class EnumUtility { 
    #region --Database Readers Enum 
    public static class EnumDBReader { 
     public enum Actions { Create, Retrieve, Update, Delete}; 
    } 
    #endregion 

    #region --Database Users Enum 
    public static class EnumDBUsers { 
     public enum UserIdentity { user, admin }; 
    } 
    #endregion 

} 

Entonces toda enumeración que se puede utilizar en todo las soluciones por proyecto será declarado en él. Use # region para separar cada preocupación. Por esto, es más fácil buscar cualquier enumeraciones

Cuestiones relacionadas