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 .