2011-03-21 14 views
14

He creado algunos colores por defecto en una aplicación Windows Forms C#, así:Definición de colores como constantes en C#

readonly Color ERROR = Color.Red; 
readonly Color WARNING = Color.Orange; 
readonly Color OK = Color.Green; 

Por lo que yo sé, sólo lectura es esencialmente una constante para mis propósitos. Si intento definirlos como constantes, el compilador indica que debe ser una constante en tiempo de compilación, y Color no.

soy bueno dejando éstos y como es, o hay alguna manera de definir estas constantes que debería tener en cuenta?

(El propósito es simplemente tener un único lugar en el que cambiar todos los colores para los fines de registro.)

Respuesta

18

Solo los literales se pueden definir como const. La diferencia es que los valores const son horneados en los ensambles que lo utilizan. En caso de que su definición cambie, los sitios de llamadas no se darán cuenta a menos que se vuelvan a compilar.

En contraste, readonly declara una variable de una manera que no puede ser reasignado después fuera de la constructor (o constructor estático en caso de una variable static readonly).

lo tanto, usted no tiene otra manera a continuación, utilizar sólo lectura aquí, ya que el color es una estructura, y ningún tipo de datos primitivo o literal.

+1

Esto es muy importante, y me atrevería a decir que es compatible con la idea de que 'readonly static' es la forma preferida de' const'. –

1

Usted podría al menos hacer 'em estática. Un campo de solo lectura es solo eso, un campo, que solo se puede asignar durante la inicialización. No garantiza que el valor representado sea "de solo lectura".

+0

Buen punto, he hecho ellos estática ahora. – JYelton

3

Un campo const es una constante compile time - que realmente necesita la ejecución de código para determinar el valor de Color.Orange embargo, internamente, probablemente, definida como

public static readonly Color Orange = new Color(...); 

Como esto no se puede calcular en tiempo de compilación, su única opción es readonly que se establece en tiempo de ejecución.

También echa un vistazo a this article.

0

Esto está bien, y no puedes hacer nada mejor (como te dice el compilador).

Pero hazlos static, si no lo están haciendo todavía.

1

Aparte de los aspectos técnicos que otros han mencionado (que const valores se reemplazan en tiempo de compilación en los lugares que se utilizan, y están obligados a ser literales en lugar de static readonly valores que se asignan y se le haga referencia en tiempo de ejecución) hay un tema semántico a considerar.

La razón const valores se reemplazan en tiempo de compilación es que const realmente quiere decir "constante" - como en un valor que nunca, nunca cambiar como pi o e . Es por eso que es seguro reemplazarlos en tiempo de compilación, porque el nombre representa un valor para siempre invariable.

El hecho de que dices ...

El propósito es simplemente tener una sola ubicación en la que cambiar todos los colores para fines de registro.

... indica que no son semánticamente constantes, y por lo tanto no deberían definirse como const incluso si fuera posible.

+0

Usted trae a colación un buen punto. En * teoría * no cambiarán, a menos que la gerencia diga algo así como "Oye, el rojo es demasiado difícil de leer en la ventana de registro". – JYelton

1

Se puede definir una estáticas Colores como esto:

// tested with C# 5.0 
static const Color ERROR = Color.FromArgb(0, 255,0); 
static const Color MYPOOL = Color.FromKnownColor(KnownColor.Aqua); 
+0

Esto no se compilará porque un 'Color' no es una constante en tiempo de compilación. – Pyroglyph