visual tipos studio rangos letras fundamentos funciones declarar datos constantes como c# colors compile-time-constant

tipos - Definiendo los colores como constantes en C#



tipos de datos en c# visual studio (6)

Al menos podrías hacerlos estáticos. De lo contrario, un campo de solo lectura es solo eso, un campo al que solo se puede asignar durante la iniciación. No garantiza que el valor representado sea "solo lectura".

He configurado algunos colores predeterminados en una aplicación de formularios C # como:

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

Que yo sepa, la lectura es esencialmente una constante para mis propósitos. Si intento definirlas como constantes, el compilador indica que debe ser una constante de compilación, cuyo color no lo es.

¿Soy bueno dejando estas cosas tal como están o hay alguna manera de definir estas constantes de las que debería estar consciente?

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


Aparte de los aspectos técnicos que otros han mencionado (que los valores const se reemplazan en tiempo de compilación en los lugares donde se usan y se requiere que sean literales en lugar de valores de static readonly que se asignan y se mencionan en tiempo de ejecución), existe un problema semántico considerar.

La razón por la cual los valores const se reemplazan en tiempo de compilación es que const realmente significa "constante", como en un valor que nunca cambiará, como pi o e . Es por eso que es seguro reemplazarlos en tiempo de compilación, porque el nombre representa un valor que nunca cambia.

El hecho de que usted declara ...

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

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


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

Pero hazlos static , si no lo son ya.


Puedes definir unos colores estáticos como este:

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


Solo los literales pueden definirse como const . La diferencia es que los valores const se incorporan directamente a los ensamblajes que los utilizan. Si su definición cambia, los sitios de llamada no se darán cuenta a menos que se vuelvan a compilar.

Por el contrario, readonly declara una variable de una manera que no puede ser reasignada después de fuera del constructor (o constructor estático en el caso de una variable static readonly ).

Por lo tanto, no tiene otra forma de utilizar la lectura de solo aquí, ya que el color es una estructura, y no hay un tipo de datos primitivo o literal.


Un campo const es una constante de compile time ; en realidad, necesita un código para ejecutarse para determinar el valor de Color.Orange embargo, probablemente se define internamente como

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

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

También puedes ver este artículo .