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

int numero2) { this. namespace CondicionCompilacion { public class OperacionMatematica { int numero1 = 0.NET. int numero2 = 0. 2 . al que se ha denominado CondicionCompilacion condiciona la compilación del método Division de la clase OperaciónMatematica al modo DEBUG. public OperacionMatematica(int numero1.numero1 = numero1. El otro grupo de atributos correspondería a aquellos que puede definir el programador. 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 .Diagnostics.NET. resultado). Console. Pero. 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 . this.WriteLine("Cociente = {0}". using System. } [ConditionalAttribute("DEBUG")] public void Division() { int resultado = numero1 / numero2. El siguiente proyecto desarrollado en SharpDevelop. 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. resultado).El Framework . 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. } public void Adicion() { int resultado = numero1 + numero2. Console. como el que pusimos de ejemplo anterior.numero2 = numero2.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.WriteLine("Suma = {0}". antes de entrar a construir nuestros propios atributos. using System.

ReadKey(true). 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.} } class Programa { public static void Main(string[] args) { OperacionMatematica operacion. 5). 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. la mayoría de lenguajes . operacion = new OperacionMatematica(30. Console. Podemos observar claramente que este atributo le informa al compilador cuando debe compilar el método al cual se ha asignado. 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.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. mientras que en la segunda compilación no se incluye el método Division al cual se le ha asignado la directiva [ConditionalAttribute("DEBUG")].Diagnostics. Además. lo cual garantiza que no se generará ningún error de compilación por la exclusión del mismo. Pero en el llamado que se hace de estas clases. 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. operacion.Adicion(). } } } Lo primero que se debe hacer para utilizar el atributo ConditionalAttribute es incluir el espacio de nombres System. En seguida se han definido dos clases que conforman el programa de prueba: OperacionMatematica y Programa. operacion. La segunda clase tan solo implementa el método Main.Division(). en el cual se construye un objeto con la clase anterior y se hace un llamado a los métodos que lo conforman.

Esta es un simplificación resultado de una pequeña ayuda que nos da . } 4 . i < largo. 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.Write("_"). } } [Obsolete("Ya existe una clase gráfica para esta tarea")] public class LineaRecta { int largo. namespace ClaseObsoleta { class Programa { public static void Main(string[] args) { LineaRecta linea = new LineaRecta(). la cual se puede leer a través de la propiedad Message. public int Largo { get { return largo.Dibujar(). i++) { Console. 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. El siguiente ejemplo muestra el uso del atributo Obsolete aplicado a la clase LineaRecta: using System. excepto a parámetros y valores devueltos. pero se desea mantener la compatibilidad con las nuevas implementaciones. Al asignar el valor true a la propiedad IsError el compilador produce un error y genera una cadena de texto sobre dichom. 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. } set { largo = value. 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. } } public void Dibujar() { for (int i = 0.ReadKey(true). Console. Así. linea. El atributo Obsolete puede aplicarse a cualquier tipo de C#. el atributo ObsoleteAttribute puede codificarse simplemente como Obsolete. linea.problema alguno de compilación.NET. por ejemplo.Largo = 10.

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

Sign up to vote on this title
UsefulNot useful