Programación con Atributos

¿Que son los atributos?
El término atributo puede resultar un tanto confuso para quienes no están habituados a la terminología .NET, si se tiene en cuenta que este se utiliza en teoría de Programación Orientada a Objetos para referirse a las variables principales de una clase que sirven para almacenar los datos básicos de los objetos que posteriormente se definirán con ella, o lo que también suele identificarse como campos. Sin embargo en la programación orientada a objetos moderna el término atributo se maneja en otro contexto y hace referencia a información extra que se adhiere a una clase o a los elementos que la componen. Los atributos son elementos que permiten incluir directivas en las clases y sus elementos para suministrar información extra que pueda ser utilizada por el compilador o por otras clases en tiempo de ejecución. Esta información puede exigir que un programa se compile de una u otra forma, dependiendo de las condiciones que se presenten en el momento mismo del proceso, y de hecho determinará la forma como se vaya a ejecutar el código de programación. En general un atributo es una clase que se deriva de la clase System.Attribute, definida en la biblioteca de clases del Framework .NET. Así, por ejemplo, la clase CampoTablaAttribute, definida como se muestra en seguida, es un atributo:
public class CampoTablaAttribute : Attribute { string nombreCampo; public CampoTablaAttribute(string nombreCampo) { this.nombreCampo = nombreCampo; } }

La función principal de los atributos consiste en asociar metadatos personalizados a los elementos de un programa. Para esto es importante tener en cuenta que, desde la perspectiva informática, un metadato cumple la función de suministrar información relacionada con uno o varios datos específicos, y por esto se dice que un metadato es un dato de un dato. En la programación con .NET estos metadatos son embebidos dentro del ensamblado durante el proceso de compilación del mismo.

1

namespace CondicionCompilacion { public class OperacionMatematica { int numero1 = 0. Console. El otro grupo de atributos correspondería a aquellos que puede definir el programador.WriteLine("Cociente = {0}". 2 . antes de entrar a construir nuestros propios atributos.NET. El siguiente proyecto desarrollado en SharpDevelop. El atributo ConditionalAttribute Para entender mejor el concepto de atributo vamos a iniciar con un sencillo ejemplo que hace uso del atributo ConditionalAttribute incluido en la biblioteca de clases del Framework . public OperacionMatematica(int numero1. Estos últimos tienen la función básica de suministrar información de un elemento de programa para que pueda ser utilizada por otras partes del mismo.Diagnostics. int numero2) { this. resultado). } [ConditionalAttribute("DEBUG")] public void Division() { int resultado = numero1 / numero2. como el que pusimos de ejemplo anterior. } public void Adicion() { int resultado = numero1 + numero2. int numero2 = 0. Este atributo tiene la función de condicionar la compilación de los métodos de una clase dependiendo de si este proceso se hizo en modo DEBUG o en modo RELEASE.NET.numero2 = numero2. resultado). this.WriteLine("Suma = {0}".NET incluye en su biblioteca de clases muchos atributos que en su gran mayoría cumplen con la función principal de suministrar información al compilador para determinar la forma como este debe realizar el proceso de compilación y en consecuencia manipular el comportamiento mismo de un programa dependiendo de las condiciones que puedan darse en tiempo de ejecución. using System. Console. al que se ha denominado CondicionCompilacion condiciona la compilación del método Division de la clase OperaciónMatematica al modo DEBUG. using System. es importante tener bien clara la funcionalidad de los mismos y una buena forma de lograrlo puede ser analizando como funcionan los atributos ya definidos en el Framework . Pero.El Framework .numero1 = numero1.

Diagnostics. La segunda clase tan solo implementa el método Main. El atributo ObsoleteAttribute Antes de continuar con el uso de atributos es necesario aclarar que por cuestiones de nomenclatura y manejo apropiado de las directrices de codificación se acostumbra a identificar todas las clases que representan atributos con el sufijo Attribute. 5). Console. mientras que en la segunda compilación no se incluye el método Division al cual se le ha asignado la directiva [ConditionalAttribute("DEBUG")]. si la compilación se hace en modo RELEASE la salida será similar a la siguiente: Suma = 35 Lo anterior nos muestra que en la primera compilación se incluyen todos los métodos de la clase OperacionMatematica. la mayoría de lenguajes .Adicion(). La clase OperacionMatematica hace uso del atributo ConditionalAttribute para informarle al compilador que debe compilar el método Division únicamente cuando se haga en modo DEBUG. Si el lector compila y ejecuta el programa en modo DEBUG observará que en la ventana de comandos aparece una salida similar a la siguiente: Suma = 35 Cociente = 6 En cambio. Pero en el llamado que se hace de estas clases. en el cual se construye un objeto con la clase anterior y se hace un llamado a los métodos que lo conforman. operacion = new OperacionMatematica(30. En seguida se han definido dos clases que conforman el programa de prueba: OperacionMatematica y Programa. operacion.} } class Programa { public static void Main(string[] args) { OperacionMatematica operacion.ReadKey(true). Podemos observar claramente que este atributo le informa al compilador cuando debe compilar el método al cual se ha asignado. Además. lo cual garantiza que no se generará ningún error de compilación por la exclusión del mismo. } } } Lo primero que se debe hacer para utilizar el atributo ConditionalAttribute es incluir el espacio de nombres System. operacion.NET obvian el uso de este sufijo sin que esto implique 3 . en la compilación en modo RELEASE se ignorará cualquier llamado que se haga al método Division.Division().

Console. Así. por ejemplo. El atributo Obsolete puede aplicarse a cualquier tipo de C#. linea. } set { largo = value. public int Largo { get { return largo.Largo = 10. Al asignar el valor true a la propiedad IsError el compilador produce un error y genera una cadena de texto sobre dichom. pero se desea mantener la compatibilidad con las nuevas implementaciones. Esto es muy frecuente en la implementación de nuevas versiones de componentes cuando se ha decidido eliminar una parte del código que se incluía en la antigua versión. } 4 . El siguiente ejemplo muestra el uso del atributo Obsolete aplicado a la clase LineaRecta: using System. La clase ObsoleteAttribute define las propiedades Message e IsError que se encargan de suministrar la información necesaria que necesita el compilador para decidir que hacer con los tipos que han sido marcados como obsoletos.NET. Su función es informar al programador que algunos fragmentos de código se han declarado obsoletos y que se han reemplazado por otros o ya no son válidos de usar. El valor por defecto de la propiedad IsError es false lo cual hace que se produzca siempre una aviso cuando se compila el código. i++) { Console. la cual se puede leer a través de la propiedad Message. linea. } } public void Dibujar() { for (int i = 0. Esta es un simplificación resultado de una pequeña ayuda que nos da .problema alguno de compilación.Write("_"). } } [Obsolete("Ya existe una clase gráfica para esta tarea")] public class LineaRecta { int largo. i < largo. el atributo ObsoleteAttribute puede codificarse simplemente como Obsolete.Dibujar().ReadKey(true). excepto a parámetros y valores devueltos. namespace ClaseObsoleta { class Programa { public static void Main(string[] args) { LineaRecta linea = new LineaRecta().

como los que se agregan a la ventana de Herramientas de los IDEs. 2012 . se genera una mensaje de advertencia que corresponde al mensaje asignado al atributo.WriteLine().Tangua. suministrar de una forma muy sencilla la información necesaria que se debe mostrar en la ventana Propiedades cuando uno de ellos es seleccionado. } } } Al compilar el programa. En estos casos el compilador genera los metadatos necesarios que le permitirán al IDE cargar y mostrar dicha información en el lugar y la forma apropiados. Los más utilizados son aquellos que le permiten al desarrollador de componentes para interfaces gráficas. lee el mensaje que se ha asignado a dicho atributo y finalmente genera el metadato necesario que se escribe sobre el ensamblado de este programa. En este caso el compilador identifica que a la clase LineaRecta se le ha fijado el atributo Obsolete. Igual que los anteriores existe una infinidad de atributos integrados en el Framework de .Console.NET. aunque el proceso se ejecuta completamente. Colombia 5 . A su vez el IDE lee el mensaje incluido en los metadatos del ensamblado y lo muestra por medio de la consola de salida.

Sign up to vote on this title
UsefulNot useful