TOC

This article is currently in the process of being translated into Spanish (~77% done).

Clases:

Constants (the const keyword)

So far, we have dealt a lot with variables and as the name implies, variables can always be changed. The opposite of that is a constant, introduced in C# with the keyword const. When declaring a constant, you have to immediately assign a value to it and after that, NO changes can be made to the value of this constant. This is great when you have a value which doesn't ever change, and you want to make sure that it's not manipulated by your code, even by accident.

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 para de 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;
    }
}

So, we have two readonly fields: The first is private, the second one is public (we usually have properties for that, but bear with me here). The first is declared without a value (we can do that with readonly fields, unlike with constants), while the other one is initialized immediately. You will also notice that we're using the DateTime class as the data type, and we assign a non-constant value to it. In other words, we do a lot of stuff that we can't do with constants, making readonly fields a nice alternative to constants.

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.

This article has been fully translated into the following languages: Is your preferred language not on the list? Click here to help us translate this article into your language!