Estoy tratando de declarar una constante PI como esta:
public static const double PI = Math.PI;
pero ¿por qué obtengo este error?
The constant 'Calendar.NewCalendar.PI' cannot be marked static
Respuestas:
constimplica static(no necesita una instancia para hacer referencia al constvalor).
También quiero agregar este punto importante: cuando vincula (hace referencia) a un ensamblado con a public const, ese valor se copia en su ensamblaje. Entonces, si el constvalor en el ensamblado al que se hace referencia cambia, su ensamblado aún tendrá el valor compilado originalmente.
Si este comportamiento no es aceptable, debería considerar convertir el campo en un public static readonlycampo.
Lib.dll, proporcionado como binario:
public class Foo {
public const int HATS = 42;
public static readonly int GLOVES = 33;
}
App.exe, hace referencia a Lib.dll:
Foo.HATS // This will always be 42 even if the value in Lib.dll changes,
// unless App.exe is recompiled.
Foo.GLOVES // This will always be the same as Foo.GLOVES in Lib.dll
Desde MSDN :
No cree una constante para representar información que espera cambiar en cualquier momento. Por ejemplo, no use un campo constante para almacenar el precio de un servicio, el número de versión de un producto o el nombre de marca de una empresa. Estos valores pueden cambiar con el tiempo y debido a que los compiladores propagan constantes , será necesario volver a compilar otro código compilado con sus bibliotecas para ver los cambios.
Desde DotNetPerls :
DLL. Cuando utiliza un
constcampo o una declaración, el compilador de C # incrusta elconstvalor de la variable directamente en el código IL. Por lo tanto, esencialmente borra elconstcomo una entidad separada.Precaución: Si los programas que dependen de a
constno seconstvuelven a compilar después de que cambia el valor, pueden romperse [ porque seguirán usando el valor anterior ].
Una constante es estática por definición.
Las constantes no se pueden reemplazar en el código durante la compilación, no en el tiempo de ejecución, por lo que no hay requisitos para las definiciones estáticas frente a las de instancia.
Todas las declaraciones de constantes son implícitamente estáticas, y la especificación C # establece que la inclusión (redundante) del modificador estático está prohibida. Creo que esto es para evitar la confusión que podría ocurrir si un lector viera dos constantes, una declarada estática y la otra no; fácilmente podrían asumir que la diferencia en la especificación implica una diferencia en la semántica. Dicho esto, no existe ninguna prohibición de especificar de forma redundante un modificador de acceso que también es el predeterminado, donde hay una opción. Por ejemplo, un método (concreto) se puede marcar explícitamente como privado a pesar de que sea el predeterminado. La regla parece ser que cuando no hay elección (por ejemplo, una declaración de método en una interfaz), el modificador redundante está prohibido. Donde hay una opción, está permitido.