This article has been localized into Spanish by the community.
Constantes (la palabra clave const)
Hasta ahora, hemos tratado con variables y como el nombre implica, las variables siempre pueden ser modificadas. Lo opuesto a eso es una constante, introducida en C# con la palabra clave const. Cuando declaras una constante, tienes que asignarle inmediatamente un valor y luego de eso, no se puede cambiar el valor de esta constante. Esto es grandioso cuando tienes un valor que nunca cambia, y quieres asegurarte de que no sea manipulado por tu código, incluso por accidente.
Encontrará muchas constantes en el mismísimo framework, ej. en la clase Math, donde una constante para PI ha sido definida:
Console.WriteLine(Math.PI);
Pero por supuesto, la parte interesante es declarar algunas constantes propias. Una contante puede ser definido en el cuerpo de un método, como éste:
static void Main(string[] args)
{
const int TheAnswerToLife = 42;
Console.WriteLine("The answer to life, the universe and everything: " + TheAnswerToLife);
}
De todos modos, la mayoría de las constantes son declaradas a nivel de clase, de tal manera que ellas puedan ser accedidas (pero no cambiadas, por supuesto) desde todos los métodos de la clase y aún desde afuera de la clase, dependiendo de la visibilidad. Una constante actuará como un miembro estático de la clase, lo que significa que puede accederse a ella sin crear una instancia de la clase. Con eso en mente, probemos un ejemplo completo donde dos constantes son definidas - una constante privada y una pública:
using System;
namespace Constants
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("The fake answer to life: " + SomeClass.TheFakeAnswerToLife);
Console.WriteLine("The real answer to life: " + SomeClass.GetAnswer());
}
}
class SomeClass
{
private const int TheAnswerToLife = 42;
public const int TheFakeAnswerToLife = 43;
public static int GetAnswer()
{
return TheAnswerToLife;
}
}
}
Notemos como defino una clase (SomeClass) con dos constantes. La primera es privada, de manera que sólo puede ser accedida desde la misma clase, pero la otra es pública. Así, en nuestro código de programa principal, accedo a ambas constante en forma diferente - primero directamente, ya que la repuesta falsa está disponible en forma pública, y en el segundo caso con la ayuda del método GetAnswer().
Qué tipos pueden ser usados como una contante?
Debido a que las constantes deben se declaradas inmediatamente y no pueden cambiar su valor después, el valor que asigna a una constante tiene que ser una expresión constante y el compilador debe poder evaluar el valor ya en tiempo de compilación. Esto significa que números, valores lógicos y cadenas de caracteres pueden ser usados sin problemas para una constante, mientras ej. un objeto del tipo DateTime no puede ser usado como una constante.
Ya que el compilador necesita saber el valor inmediatamente, también quiere decir que hay algunas limitaciones con lo que puede hacer cuando establece el valor. Por ejemplo, estos son ejemplos perfectos de lo que PUEDE hacer:
const int a = 10;
const float b = a * 2.5f;
const string s1 = "Hello, world!";
const string s2 = s1 + " How are you?";
Por otro lado, no puede usar el resultado del la llamada a un método o un miembro no constante de clase, ya que éstos no son expresiones constantes. Aquí tenemos un ejemplo de lo que NO PUEDE hacer:
// NOT possible:
const int a = Math.Cos(4) * 2;
// Possible:
const string s1 = "Hello, world!";
// NOT possible:
const string s2 = s1.Substring(0, 6) + " Universe";
La diferencia radica en que puede esperarse que el compilador conozca cuando llega a línea de código, por ejemplo números, cadena de caracteres y otras constantes, en contraste con lo que debe ejecutarse para obtener su valor.
Una constate alternativa. El campo de sólo lectura.
Si está buscando por un versión más liviana y menos restrictiva de una constante de clase, puede querer darle una mirada a la palabra clave readonly. No está disponible a nivel de método, pero puede usarse a nivel de clase, definir un campo el cual sólo puede ser modificado durante la declaración o la ejecución del método constructor de la clase. Así, tan pronto como el objeto está disponible para su uso, el campo readonly tendrá el mismo valor para siempre y no podrá ser modificado por el usuario. Probemos ésto:
class SomeClass
{
private readonly DateTime rightNow;
public readonly DateTime later = DateTime.Now.AddHours(2);
public SomeClass()
{
this.rightNow = DateTime.Now;
}
}
Así, tenemos dos campos de solo lectura: El primero es privado, el segundo es público (usualmente tenemos propiedades para eso, pero ténme un poco de paciencia aquí). El primero fue declarado sin un valor (podemos hacer eso con campos de solo lectura, a diferencia de las constantes), mientras que el otro es inicializado inmediatamente. También notaras que estamos usando la clase DateTime como el tipo de datos, y le asignamos un valor no constante. En otras palabras, hacemos un montón de cosas que no podemos hacer con constantes, convirtiendo a los campos de solo lectura una buena alternativa a las constantes.
Noten como asigno un valor al campo rightNow en el constructor de la clase SomeClass. Como ya se mencionó, esta es la última oportunidad de asigna un valor al campo de solo lectura. Después de eso, esté en un método dentro de la clase que está definiendo o por fuera, obtendrá un error de compilación si trata de asignar un valor a un campo de sólo lectura.
Resumen
Una constante puede ser definida adentro del alcance de un método o a nivel de clase. Ésto permite definir un valor el cual es conocido en tiempo de compilación y que no se podrá cambiar después. Tipos típicos usados como constantes son enteros, flotantes, cadena de caracteres y valores lógicos. Si está buscando mayor flexibilidad, pruebe con el campo de solo lectura, descripto arriba.