martes, 15 de octubre de 2013

Constantes en C#

Tabla de Contenido

0. Introducción
1. Constantes en C#
2. Constantes vs Campos static readonly
3. Ejemplos de Uso de Constantes en C#
4. Comentarios
5. Conclusiones
6. Glosario
7. Enlaces & Literatura

0. Introducción

En este artículo les hablaré acerca de otro de los elementos de construcción en C#: las constantes. Así como en matemáticas tenemos constantes como PI (3.14159265), o número de Euler (2.71828183), o en física la constante de gravedad (9.8m/s^2); en programación también podemos usar constantes para referirnos a valores que no cambiaran a lo largo de la ejecución del programa.

1. Constantes en C#

Una definición sencilla y directa de constante: campo miembro estático cuyo valor no puede cambiar en el ciclo de vida un programa [1]. En [5] también encontramos está interesante definición:
Constants are immutable values which are known at compile time and do not change for the life of the program.
Entonces, una vez que declaremos la constante, es necesario asignarle un valor del dominio del correspondiente tipo de dato. Por lo tanto, si en próximas sentencias, por ejemplo, en un contructor intentamos asignar un nuevo valor a una contante, se generará el mensaje de error:

error CS0131: The left-hand side of an assignment must be a variable, a property or an indexer

Básicamente este error nos deja claro que no es posible asignar un valor a una constante, o que no puede ser usado como miembro izquierdo (l-value, en inglés) en una sentencia de asignación.

Continuando, en C# podemos declarar una constante para tipos de datos integrales (e.gr.: byte, int, double, long, enum, como otros también); sin embargo, no está permitido declarar un contante de tipo object (Sytem.Object [6]). Tampoco se puede utilizar const para los tipos definidos por el usuario: clases, estructuras, y arreglos, en su lugar, se utiliza el modificador readonly [6].

Pasemos a ver un ejemplo sencillo de declaración de una constante como miembro de una clase:

En la línea 3 declaramos una constante de tipo int y le asignamos el valor 12 (para significar el número de meses de un año). Por convención histórica, el identificador de una constante se escribe en MAYÚSCULA sostenida; por ejemplo:
  • PI
  • MESES
  • HORAS_DIA
  • FUERZA_DE_GRAVEDAD
  • E

2. Constantes vs Campos static readonly

Resumen de las diferencias más importantes de constantes y campos static readonly:
  • No es posible declarar un constante de tipo object o cualquier tipo de datos definido por el programador. Con readonly sí es posible.
  • La evaluación del valor de una constante ocurre en tiempo de compilación. Es decir que su valor se mantendrá durante todo el ciclo de vida del programa; para cambiarlo tendríamos que hacer una modificación del archivo de código fuente y volver a realizar la compilación. Veamos el siguiente ejemplo:
public static double Circunferencia (double radio)
{
return 2 * Math.PI * radio;
}

public static double Circunferencia (double radio)
{
return 6.2831853071795862 * radio;
}

El compilador de C# omitirá la declaración original del método (primer fragmento de código del método Circunferencia) y utilizará la segunda. Obsérvese la conversación que se efectuado para hacer más eficiente el uso del espacio en memoria, ya que no se hace una reserva de memoria para las constantes [7]: El valor 6.2831853071795862 siempre será usado en lugar de la subexpresión 2 * Math.PI.
In fact, when the compiler encounters a constant identifier in C# source code (for example, MONTHS), it substitutes the literal value directly into the intermediate language (IL) code that it produces. Because there is no variable address associated with a constant at run time...
En [8] hay una discusión interesante acerca de la diferencia entre usar const o readonly para valores constantes.

Además en [1] se extienden un poco más sobre la ventaja de usar static readonly sobre const:
static readonly vs const
Figura 1. Ventaja de static readonly sobre const [1].

En [7] también nos advierten en la misma medida frente al caso de las constantes en los assemblies:
Note about constants in assemblies
Figura 2. Uso de constantes en assemblies [7].

3. Ejemplos de Uso de Constantes en C#

Veamos el punto interesante en este corto código fuente de ejemplo: es posible declarar e inicializar varias constantes en una sola sentencia de declaración. Eso es lo que ocurre en la línea 3.

Archivo C# Calendario3.cs [enlace alternativo]:
De este ejemplo de código fuente, hay que resaltar que una constante puede ser utilizada como subexpresión de una sentencia de asignación.

4. Conclusiones

Espero que este artículo haya sido de ayuda y haya dejado claro el concepto de constante en C#. Siendo así, hemos aprendido a declarar variables como constantes, a conocer sus alcances, a diferenciar entre const y static readonly. Al Final se presentaron algunos ejemplos básicos de la declaración de constantes.

5. Glosario

  • Constante
  • l-value
  • r-value
  • readonly

6. Enlaces & Literatura

[1]: C# 5.0 in a Nutshell by Joseph Albahari and Ben Albahari. Copyright 2012 Joseph Albahari and Ben Albahari, 978-1-449-32010-2.
[2]: \pi with 9 digits - Wolfram|Alpha - http://www.wolframalpha.com/input/?i=%5Cpi+with+9+digits
[3]: e number with 9 digits - Wolfram|Alpha - http://www.wolframalpha.com/input/?i=e+number+with+9+digits
[4]: Gravity of Earth - Wikipedia, the free encyclopedia - http://en.wikipedia.org/wiki/Gravity_of_Earth
[5]: Object Class (System) - http://msdn.microsoft.com/en-us/library/System.Object.aspx
[6]: readonly (C# Reference) - http://msdn.microsoft.com/en-us/library/acdd6hb7.aspx
[7]: Constants (C# Programming Guide) - http://msdn.microsoft.com/en-us/library/ms173119.aspx

O

No hay comentarios:

Publicar un comentario

Envíe sus comentarios, dudas, sugerencias, críticas. Gracias.