En la plataforma .NET, y por lo tanto en Visual Basic, los atributos se introdujeron como una herramienta poderosa para anotar varios elementos de código con metadatos. Esto permite que los programas y herramientas obtengan información adicional durante la ejecución y compilación, configurando el comportamiento de métodos, clases y propiedades a través de mecanismos de reflexión, serialización, automatización de pruebas, etc.
Sin atributos, es necesario codificar rígidamente la lógica adicional para configurar métodos o clases, y las bibliotecas universales no pueden ser extensibles y flexibles sin información externa sobre la clase o método. También surge el problema de transmitir configuraciones sin modificar el propio código.
Los atributos son clases especiales que heredan de Attribute. Se pueden crear y aplicar a métodos, clases, propiedades, parámetros o valores devueltos. En tiempo de ejecución, estos atributos se pueden descubrir a través de reflexión y modificar el comportamiento de la lógica correspondiente.
Ejemplo de código para crear y utilizar un atributo propio:
Imports System <AttributeUsage(AttributeTargets.Class Or AttributeTargets.Method, AllowMultiple:=False)> Public Class InfoAttribute Inherits Attribute Public Property Description As String Public Sub New(desc As String) Description = desc End Sub End Class <Info("Método especial de lógica de negocio.")> Public Sub Calculate() Console.WriteLine("Cálculo realizado.") End Sub ' Lectura del atributo a través de reflexión Dim method = GetType(Module1).GetMethod("Calculate") Dim attr = CType(Attribute.GetCustomAttribute(method, GetType(InfoAttribute)), InfoAttribute) If attr IsNot Nothing Then Console.WriteLine(attr.Description)
Características clave:
AttributeTargets.Class, Method, Property, etc.)¿Pueden los atributos cambiar directamente el comportamiento de un método o clase sin usar reflexión?
No, los atributos en sí mismos solo contienen metadatos. El comportamiento de un objeto solo se puede cambiar si el código que llama o el runtime verifica la existencia del atributo a través de reflexión y toma acciones adicionales.
¿Se puede asignar el mismo atributo varias veces al mismo elemento, y qué se requiere para ello?
Por defecto, no. Para ello, al declarar el atributo, se debe especificar AllowMultiple:=True en AttributeUsage. Entonces se puede aplicar un atributo varias veces a un mismo elemento.
¿Se heredan los atributos de la clase base a la derivada?
No, por defecto no se heredan. Si se requiere herencia, en AttributeUsage se especifica el parámetro Inherited:=True.
En el proyecto se colocan masivamente atributos personalizados para métodos, pero nadie implementa el procesamiento de estos atributos a través de reflexión; tal código se convierte en una carga inútil, dificultando el mantenimiento y complicando la lectura de las fuentes.
Ventajas:
Desventajas:
Se aplica un atributo para anotar métodos de registro, y una subsistema separada a través de reflexión determina automáticamente qué métodos deben ser auditados, inserta análisis y agrega trazabilidad. El comportamiento es transparente para el usuario.
Ventajas:
Desventajas: