2010-11-29 7 views
5

Estoy creando una clase de búsqueda por lo que se usará un valor constante en todos los proyectos. El problema es que hay varias soluciones para crear tal cosa. Podría crear una sola clase con enumeraciones, estructuras o constantes o crear una sola clase para cada 'objeto'. Me pregunto cuál sería la mejor solución.Clase de búsqueda use enum, struct, public const, algo más?

principio pensé hacer algo como esto:

public static class Defines 
    { 
     public enum PAGELAYOUT_NAMES 
     { 
      STANDARD = "Standard" 
     } 
    } 

Pero personalmente no me gusta el uso de cadenas en las enumeraciones tanto. Otra opción sería utilizar una estructura, que es aún más feo si ve el código:

public static class Defines 
    { 
     public struct PAGELAYOUT_NAMES 
     { 
      public static string STANDAARD = "Standaard"; 
     } 
    } 

Esto se ve un poco mejor, pero podría ser confuso cuando se tiene una gran cantidad de opciones:

public static class Defines 
{ 
     public const string PAGELAYOUT_NAMES_STANDARD = "Standard"; 
} 

al escribir este post, creo que esto va a ser la mejor opción/limpia:

public static class PageLayout 
{ 
    public const string STANDARD = "Standard"; 
} 

¿Alguna otra sugerencia? Rellenar el proyecto con varias clases que solo definen algunas constantes me parece una gran cantidad de sobrecarga y desorden.

Editar No estaba muy claro en el contexto original, pero los valores de búsqueda no están limitados a solo cadenas. Algunas sugerencias muy buenas a continuación solo son posibles si solo se utilizan cadenas, pero también se deben admitir Int, DateTime y otros tipos. Tengo algunas buenas ideas de las respuestas aquí, voy a probar cuál funcionará mejor en mi proyecto actual.

solución final implementado Gracias a las sugerencias a continuación, he implementado las clases de consulta como esta:

internal class Base<T> 
    { 
     internal T Value{ get; private set;} 
     internal Base(T value) 
     { 
      Value = value; 
     } 
    } 
    public class PageLayout 
    { 
     public static string Standard { get { return new Base<string>("Standard").Value; } } 
    } 

Esto se basa en una respuesta dada a continuación. La razón es porque ahora puedo usar esto para no-cuerdas & enteros también, que en realidad no es posible con una enumeración con una descripción y un archivo de recursos, a pesar de que se sentiría más limpio para mí.

Respuesta

2

Prefiero esta manera usando propiedades estáticas de fábrica. Pero depende del escenario exacto. Puede usar string o enum como campo.

public class PageLayout 
    { 
     private readonly string LayoutType; 
     private PageLayout(string layoutType) 
     { 
      LayoutType = layoutType; 
     } 
     public static Standard {get {return new PageLayout("Standard");}} 
    } 

Luego, en llamar utilice el código de PageLayout.Standard

+0

Aunque me gusta la limpieza de Iain Galloway su sugerencia, la he implementado porque también puede agregar valores enteros y sin cadena, como Guids, DateTime, etc. –

4

Dependiendo de lo que esté haciendo exactamente, probablemente quiera mirar Resources.

Defina un archivo xml (o utilice el diseñador que lo ayude), y se compila en un ensamblado (ya sea integrado, o un "ensamblaje satélite").

Haga clic derecho en el nodo de propiedades bajo su biblioteca de clases en el explorador de soluciones, haga clic en "Abrir" y vaya a la pestaña de recursos. Es muy fácil comenzar desde allí.

Una vez que está establecido, es fácil de conseguir en los valores de código por ejemplo: -

String s = Resources.PageLayoutNames.Standard; 

Hay algunas complicaciones, pero sin saber más acerca de su aplicación que no puede aconsejar más. Lo que me viene a la mente es que si pruebas unidades de aplicaciones ASP.NET necesitas asegurarte de que el recurso se incruste en lugar de desplegarlo como satélite, de lo contrario, las pruebas unitarias no funcionarán.

También se utilizan para la globalización, por lo que es bueno estar familiarizado con ellos.


Editar:

alternativa después de leer su pregunta de nuevo, me siento inclinado a preguntar "¿Qué se necesita para la cadena en absoluto?".

¿Qué estás haciendo que no puedes hacer con solo una enumeración?

enum PageLayouts 
{ 
    Standard, 
    ExtraAwesome 
} 

Si usted está tratando de asignar texto para su visualización a un tipo de enumeración, hay un montón de maneras de hacerlo, por ejemplo, por using the DescriptionAttribute

enum PageLayouts 
{ 
    [Description("Standard")] 
    Standard, 
    [Description("Extra Awesome")] 
    ExtraAwesome 
} 

No se puede dar el DescriptionAttribute una clave de recursos fuera de la caja, sin embargo. You have to subclass it if you want to support globalisation...

0

La gente desaconseja las clases anidadas públicas, por lo que en los ejemplos anteriores Defines debería ser un espacio de nombres en lugar de una clase externa.

0

siempre uso el enfoque

public static class PageLayout 
{ 
    public const string STANDARD = "Standard"; 
} 

.

Yo sin embargo crear más clases de uno: Cuando uso una gran cantidad de sessionvariables, creo un (public static)

class SessionNames 

y lo hago hacer una diferencia entre soultion ancho constantes y constantes de todo el proyecto.

a veces las constantes para un proyecto (por ejemplo 20 marcadores de posición en un PDF que debe crear) no tienen nada que ver con los otros proyectos, entonces hago una clase de proyecto, pero cuando tengo constantes de solución creo una clase en el mismo lugar donde pongo mis extensiones de cadena, etc.

+2

Debe tener mucho cuidado si usa valores "const". Se compilan como literales en reuniones de referencia. Esto significa que si el valor constante cambia, necesita recompilar * todos * sus dlls, no solo el que contiene la constante modificada. Vea la nota aquí: - http://msdn.microsoft.com/en-us/library/ms173119.aspx –

+0

@lain: gracias, no sabía eso – Michel