martes, 15 de octubre de 2013

Constructores Estáticos en C#

Tabla de Contenido

0. Introducción
1. Constructores Estáticos en C#
2. Constructores Estáticos y Orden de Inicialización de Campos
3. Constructores Estáticos y el Patrón de Diseño Singleton
4. Consideraciones Finales
5. Conclusiones
6. Glosario
7. Referencias

0. Introducción

En este artículo les presentaré un tema muy interesante: constructores estáticos. Los constructores estáticos nos permiten inicializar código de clase de forma automática la primera vez que creamos una instancia de una clase de objeto. Descubriremos su utilidad en la creación o uso del patrón de diseño singleton, y a este último lo contrastaremos con una versión de código más compleja que requiere de construcciones extras para completar la misma tarea del patrón: restringuir la creación de una única instancia de una clase de objeto.

1. Constructores Estáticos en C#

Los constructores estáticos en C# permiten inicializar miembros estáticos de la clase, y, como veremos adelante permiten y facilitan la implementación del patrón de diseño singleton [1]. Además, un constructor estático sólo se ejecuta una vez por tipo de dato, es decir, todo lo contrario que sucede con los constructores de tipo de dato, que se ejecutan cada vez que se creamos una instancia.

En C# sólo está permitida la declaración de un sólo constructor estático, sin parámetros, y que tenga el mismo nombre del tipo. Por ejemplo:

Archivo C# Computador.cs [enlace alternativo]:
► Prueba de ejecución.

Observamos que en la prueba de ejecución de este programa, sólo hemos declarado dos instancias de la clase Computador, pero sólo se ha mostrada una sola vez el mensaje: "El tipo se ha inicializado.".

Lo anterior se debe a que la máquina virtual -CLR- invoca de forma automática el constructor estático sólo una vez. Del proceso anterior ocurren dos situaciones :
  • Se inicializa el tipo dentro del cuerpo del constructor estático.
  • Se permite el acceso a miembros estáticos localizados en el cuerpo de declaración del tipo.

2. Constructores Estáticos y Orden de Inicialización de Campos

Las sentencias de declaración e inicialización de campos estáticos es lo primero que ocurre, luego, se invoca el constructor estático de la clase. En caso de que no se haya especificado el constructor estático, los campos con el modificador static [3] se inicializaran. También puede ocurrir que la inicialización sea portergada por la CLR.

Ahora miremos el orden de inicialización de los campos estáticos en una clase de ejemplo:

Observe que a pesar de que UsuariosAtendiendo se le asigna el valor 13; CapacidadActualUsuarios mantendrá el valor 300. Comprobémoslo:

► Prueba de ejecución.

Si nuestro propósito es inicializar CapacidadActualUsuarios en 287 (resultado de la expresión: 300 - UsuariosAtendiendo), debemos especificar primero la declaración del campo estático UsuariosAtendiendo.

3. Constructores Estáticos y el Patrón de Diseño Singleton

De acuerdo con [1], el patrón de diseño singleton básicamente consiste en restringuir la instanciación a un sólo objeto. Por ejemplo, si vamos a realizar operaciones CRUD [4] sobre una base de datos, bastaría con una sola conexión para realizar todas las consultas, ediciones, remociones, etc.

Una forma clásica de implementación consiste en crear un método estático que retorna la referencia del campo estático private declarado en la misma clase. Veamos:

Ahora usemos la versión que hace uso de constructores estáticos para poder implementar el patrón:

Archivo C# ConexionBDSingleton.cs [enlace alternativo]: 
En las líneas 10-13 se declara el constructor estático para la clase ConexionBDSingleton. En el cuerpo de declaración se invoca el constructor private de la clase.

[Nota: En [5] se explica con más detalle este interesantísimo ejemplo de uso del patrón de diseño singleton usando constructores anidados.]

4. Consideraciones Finales

En [6] se resaltan puntos importantes acerca de los constructores estáticos. Algunos son:
  • Un constructor estático no especifica ni parámetros ni modificadores de acceso.
  • Un constructor estático se invoca una sola vez, cuando se crea una primera instancia de la clase.
  • No existe mecanismo programático para invocar explícitamente un constructor estático.
  • El programador no tiene control sobre la ejecución del constructor estático.
  • Frecuentemente, los constructores estáticos son usados para la inicialización campos estáticos, o tareas de registro (log).

5. Conclusiones

Hemos tenido la oportunidad de aprender acerca de los constructores estáticos. Una aplicación posible es la implementación del patrón de diseño singleton. También aprendimos del orden de inicialización de campos estáticos cuando se provee un constructor, y cuando se carece de uno.

6. Glosario

  • Constructor estático
  • Patrón de diseño
  • Singleton

7. Enlaces & Literatura

[1]: Singleton pattern - Wikipedia, the free encyclopedia - http://en.wikipedia.org/wiki/Singleton_pattern
[2]: C# 5.0 in a Nutshell by Joseph Albahari and Ben Albahari. Copyright 2012 Joseph Albahari and Ben Albahari, 978-1-449-32010-2.
[3]: static (C# Reference) - http://msdn.microsoft.com/en-us/library/98f28cdx.aspx
[4]: Create, read, update and delete - Wikipedia, the free encyclopedia - http://en.wikipedia.org/wiki/Create,_read,_update_and_delete
[5]: Static constructor in C# - CodeProject - http://www.codeproject.com/Articles/83564/Static-constructor-in-C
[6]: Static Constructors (C# Programming Guide) - http://msdn.microsoft.com/en-us/library/k9x6w0hc.aspx


O

No hay comentarios:

Publicar un comentario

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