¿Deben las enumeraciones en C # tener su propio archivo? [cerrado]

178

Tengo una clase que usa una enumeración, la enumeración está actualmente en su propio archivo que parece un desperdicio.

¿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 usa estas enumeraciones, también lo hacen las personas que llaman externas. En otras palabras, otra clase puede establecer estas enumeraciones. Por lo tanto, no se utilizan internamente para la clase, de lo contrario esta pregunta sería obvia.

Finglas
fuente
86
Si usaras números mágicos, no tendrías este problema en absoluto.
MusiGenesis
77
¿Debería ser esto wiki comunitario? No hay una respuesta correcta ni consideraciones técnicas reales aparte de las capacidades IDE.
Jeff Sternal
1
Todavía pueden estar en el mismo espacio de nombres incluso si están en archivos diferentes. Si está haciendo la pregunta secundaria sobre si crear un espacio de nombres .Enums Y un nuevo archivo, entonces diría que, por lo general, no. Pero de lo contrario, es posible que comprenda mal los espacios de nombres y debería leer sobre ellos (no es mucho para ellos, solo un mecanismo de organización)
Jason Kleban
1
Declarar enum en su propio archivo permite al programador localizar enum fácilmente usando la ventana de comandos (> de [nombre de enum])
Riju

Respuestas:

103

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

James Curran
fuente
77
Agrega ruido al directorio al navegar, eso es lo que quise decir con derroche.
Finglas
117
@Finglas: ¡el ruido de una persona es la señal de otra persona!
Jeff Sternal
66
Por lo general, hay una clase que está más estrechamente asociada. Pero si eso cambia, si alguien llega a la vez y decide depender de la enumeración, entonces es hora de un refactorizador.
Brennan Pope
2
Si la enumeración se va a compartir entre diferentes clases, es preferible colocarla en un archivo separado.
Konrad
76

Esto es realmente solo una cuestión de preferencia.

Prefiero poner cada enumeración en su propio archivo (del mismo modo para cada interfaz, clase y estructura, por pequeña que sea). Los hace más fáciles de encontrar cuando vengo de otra solución o de lo contrario no tengo una referencia al tipo en cuestión.

Poner un solo tipo en cada archivo también facilita la identificación de cambios en los sistemas de control de código fuente sin diferir.

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

Esto es completamente una cuestión de estilo. Lo que tiendo a hacer es tener un archivo llamadoEnums.cs en la solución en la que se recopilan las declaraciones de enumeración.

Pero normalmente se encuentran a través de la F12clave de todos modos.

Fredrik Mörk
fuente
44
Creo que esta es probablemente la mejor opción, ya que: 1) es solo un archivo en lugar de muchos, lo que podría considerarse como un desorden en el directorio 2) está claro lo que contiene el archivo 3) significa que sabe dónde encontrar un archivo en enumlugar de está en un archivo que contiene una clase que está relacionada pero no necesariamente la única clase que la usa
dav_i
66
Absolutamente no me gusta esto. Como se dijo en la respuesta de James Curran, las enumeraciones tienen una relación principalmente con las clases. Al ponerlos a todos en un archivo global, ya ni siquiera están en un directorio (para un sub-espacio de nombres) donde podrían pertenecer temáticamente.
Ray
3
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.
Fredrik Mörk
@Ray ...enums have a relation to classes mostly.. Aquí es donde me perdiste. ¿Puede dar un ejemplo de cómo manejaría enumeraciones que tienen relaciones con varias clases?
K - La toxicidad en SO está creciendo.
@KarlMorrison Por favor, ese comentario tiene 5 años. De todos modos, agregué la palabra "principalmente" por una razón. Las enumeraciones tienen una relación con algo más que clases, como los espacios de nombres también. Si tuviera una AnchorStyleenumeración utilizada en una biblioteca de interfaz de usuario, normalmente también tendría un subespacio de nombres de interfaz de usuario y la carpeta correspondiente. Luego lo colocaría en un AnchorStyle.csarchivo en la carpeta de la interfaz de usuario donde pueda encontrarlo fácilmente, no en un archivo genéricamente llamado "Enums.cs".
Ray
47

La pregunta que debería hacerse sería: ¿hay algo sobre un tipo de enumeración en C # que indique que debería tratarlo de manera diferente a todos los demás tipos que creo?

Si la enumeración es pública, debe tratarse como cualquier otro tipo público. Si es privado, declararlo 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 de tipo público es lo único que importa; el sabor del tipo no.

Bryan Watts
fuente
¿Qué pasa si desea reutilizar enumeraciones en una solución diferente del mismo proyecto empresarial? Enlazar enumeraciones con la clase que lo usa sería muy difícil reutilizarlo.
mko
@mko: La referencia del proyecto ya significa que tanto la clase como la enumeración estarán disponibles para la solución diferente. ¿Qué lo haría difícil?
Bryan Watts el
Claro, pero ¿realmente quieres compartir toda la clase con su lógica si solo quieres usar enumeraciones? Además, ¿qué pasa si diferentes clases comparten la misma enumeración? ¿Dónde lo colocarías?
mko
@mko: con una referencia de proyecto, obtendrá ambos tipos, ya sea que estén en archivos diferentes o no. Tengo problemas para entender lo que preguntas.
Bryan Watts el
Bueno, no estoy hablando de referencia de proyecto, tú sí. Estoy hablando de mover enumeraciones a un archivo de proyecto compartido y poder reutilizarlo en múltiples proyectos sin exponer clases completas. Usted dice "No hay una razón convincente para poner dos tipos públicos en el mismo archivo simplemente porque uno es una enumeración". Tal vez hay una razón para poner todas las enumeraciones en el mismo archivo si sigues mi explicación.
mko
24

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

Tommy Carlier
fuente
18

Coloco principalmente dentro del espacio de nombres y fuera de la clase para que sea fácilmente accesible a otras clases en ese espacio de nombres como a continuación.

namespace UserManagement
{
    public enum UserStatus { Active, InActive }
    class User
    {
        ...
    }
}
Adeel
fuente
Guau. No sabía que las enumeraciones se pueden colocar directamente en el espacio de nombres. Me voy con esta respuesta. Dentro de mi estructura MVC, se colocarán dentro del controlador, lo que me hace lógica. Gracias por esto. Votado
C4d
11

En general, prefiero que mis enumeraciones estén en el mismo archivo que la Clase de la que probablemente será un atributo. Si, por ejemplo, tengo una clase Task, la enumeración TaskStatusestará en el mismo archivo.

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

Nikos Steiakakis
fuente
¿Qué pasa si una clase diferente también usa la misma enumeración?
mko
2
@mko: por eso dije (en 2010 cuando respondí esto) que si las enumeraciones tienen una naturaleza más genérica, las guardo en archivos separados. Por contexto, quise decir que en algunos casos algunas enumeraciones podrían estar en un archivo separado, y en otros casos, podría agrupar un conjunto de declaraciones de enumeración en un solo archivo.
Nikos Steiakakis
10

Depende de qué acceso se necesita.

Si la enumeración solo es utilizada por una sola clase, está bien declararla dentro de esa clase porque no necesita usarla en ningún otro lugar.

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 nombres apropiado. Es mucho más fácil encontrarlo de esa manera, y la estrategia sigue el patrón de un objeto por archivo, que también es bueno para usar con clases e interfaces.

Jon Seigel
fuente
8

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

enum SearchType { Forward, Reverse }

Si la enumeración es general y puede ser utilizada por varias clases para diferentes escenarios, me inclinaría a ponerla en su propio archivo. Por ejemplo, lo siguiente podría usarse para varios propósitos:

enum Result { Success, Error }
Vishal Mistry
fuente
6

Tiendo a poner 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 la definición de un tipo: en el archivo del mismo nombre. (Para ser justos, en VS siempre puedes usar "Ir a definición").

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

Dan Tao
fuente
6

Una ventaja de usar un archivo separado para las 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.

Doug Ferguson
fuente
6

Si está utilizando el complemento USysWare File Browser para Visual Studio, puede encontrar rápidamente archivos de nombres particulares en su solución. Imagine buscar 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 enumeraciones en sus propios archivos. Puede encontrarlos rápidamente, editarlos y más. Recomiendo encarecidamente poner su enumeración en su propio archivo.

Y como se dijo ... ¿Qué tan inútil es un archivo que termina siendo solo un par de kb?

Batalla
fuente
También uso ese complemento, es bastante útil. Pondría enumeraciones en su propio archivo, sin importar si la solución es grande o pequeña.
Rui Jarimba
5

Muy simple gran ventaja para separar el archivo. Cuando cualquier objeto está en su propio archivo MyObjectName.cs ... puede ir al explorador de soluciones y escribir MyObjectName.cs y ver exactamente 1 archivo. Cualquier cosa que mejore la depuración es agradable.

Otra ventaja en una nota similar, si busca un nombre en todos los archivos ( ctrl+ shft+ F), puede encontrar 20 referencias al nombre en el mismo archivo ... y ese nombre encontrado será parte de diferentes objetos. En la ventana Buscar resultados, todo lo que puede ver es el número de línea y el nombre del archivo. Tendría que abrir el archivo y desplazarse para averiguar en qué objeto estaba la referencia encontrada.

Cualquier cosa que facilite la depuración, me gusta.

vbp13
fuente
3

Si tienes múltiples proyectos en una solución. Entonces mejor crear otro proyecto Utilities. Luego cree una carpeta \Enumerationsy cree un anidado static class. Y luego asigne cada clase estática donde creará una enumeración que corresponda al nombre de sus proyectos. Por ejemplo, si tiene un proyecto llamado DatabaseReader y DatabaseUsers, 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

}

Luego, se declarará toda la enumeración que se puede usar en las soluciones completas por proyecto. Use # regionpara separar cada preocupación. Con esto, es más fácil buscar enumeraciones

Israel Ocbina
fuente
1

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

Patrick Kafka
fuente