miércoles, 15 de julio de 2015

Atributos de Información de Llamadas en C#

Índice

0. Introducción
1. Atributos Sobre Parámetros
2. Utilidad de los Atributos de Información de Llamadas
3. Conclusiones
4. Glosario
5. Literatura & Enlaces

0. Introducción

En el artículo anterior ahondamos sobre los atributos aplicables a elementos de programa como métodos, propiedades, tipos, etc; atributos que nos eran de utilidad para cambiar el comportamiento de un elemento de programa. Ahora veremos la utilidad de los atributos para obtener información sobre las llamadas de un método. Estos atributos se aplican sobre parámetros opcionales de un método: [CallerMemberName], [CallerFilePath], y [CallerLineNumber].

1. Atributos Sobre Parámetros

También es posible el uso atributos sobre los parámetros opcionales de la firma de un método. Este tipo de atributos permiten obtener información de la llamada:
  • [CallerMemberName] [2]: nombre del miembro que realizó la llamada, 
  • [CallerFilePath] [3]: ruta del archivo del miembro que realizó la llamada, y
  • [CallerLineNumber] [4]: línea en el archivo de código desde donde el miembro realizó la llamada.
Todos estos atributos se hayan declarados en el namespace System.Runtime.CompilerServices [5]. (Este namespace se especializa en proveer funcionalidad para diseñadores de compiladores con código administrado.)

Ejemplo de uso:

El método ParametrosConAtributos (líneas 18-26) tiene definidos tres parámetros opcionales:
  • [CallerMemberName] string nombreMiembro = null,
  • [CallerFilePath] string rutaArchivo = null, y 
  • [CallerLineNumber] int numeroLinea = 0.
Notemos que estamos usando los atributos que discutimos arriba para capturar el nombre, la ruta del archivo del miembro, y el número de línea desde donde el miembro ha realizado la llamada del método ParametrosConAtributos.


Respecto a la llamada a ParametrosConAtributos desde la línea 12 en Main, en [1] se muestra la llamada explícita:

ParametrosConAtributos("Main", @"A:\C#\CSharp50InANutshell\Cap04\AtributosInfoLlamadas\AtributosInfoLlamadas.cs", 10);

Compilación:


  1. csc /target:exe AtributosInfoLlamadas.cs

Ejecución assembly:


  1. .\AtributosInfoLlamadas.exe

> Prueba de ejecución: http://ideone.com/bSRkIz

> Prueba de ejecución:
Ejecución assembly AtributosInfoLlamadas.exe
Figura 1. Ejecución assembly AtributosInfoLlamadas.exe.

2. Utilidad de los Atributos de Información de Llamadas

Entre las utilidades importantes e interesantes de este tipo de atributos se tienen [1]:
  • Logging
  • Generación de notificación una vez se produzca un cambio sobre las propiedades de un objeto.
En .NET está disponible la interfaz INotifyPropertyChanged que define el evento PropertyChanged que permite a las clases que la implementen generar notificación sobre los cambios de los valores o estado de las propiedades.

Ejemplo de uso:

En este ejemplo cuando creamos un objeto de la clase UsoINotifyPropertyChanged y asignamos un valor a la propiedad NombreCliente o a IDCliente se invoca el método InvocarAlCambioPropiedad que se encarga de distinguir cuál propiedad fue invocado.

Compilación:


  1. csc /target:exe UsoINotifyPropertyChanged.cs

Ejecución assembly:


  1. .\UsoINotifyPropertyChanged.exe

> Prueba de ejecución: http://ideone.com/TNo2NC

> Prueba de ejecución:
Ejecución assembly UsoINotifyPropertyChanged.exe
Figura 2. Ejecución assembly UsoINotifyPropertyChanged.exe.

3. Conclusiones

Ahora contamos con el conocimiento fundamental para comprender la utilidad básica de los atributos de información de llamadas aplicables a parámetros opcionales en un método: registro (logging) en invocación de miembros, generación de notificaciones sobre los cambios de propiedades.


El próximo artículo C# estudiáremos código no-seguro y punteros.

4. Glosario

  • Assembly
  • Logging
  • Miembro
  • Notificación
  • Propiedad

5. Literatura & Enlaces

[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]: CallerMemberNameAttribute Class (System.Runtime.CompilerServices) - https://msdn.microsoft.com/en-us/library/system.runtime.compilerservices.callermembernameattribute(v=vs.110).aspx
[3]: CallerFilePathAttribute Class (System.Runtime.CompilerServices) -
https://msdn.microsoft.com/en-us/library/system.runtime.compilerservices.callerfilepathattribute(v=vs.110).aspx
[4]: CallerLineNumberAttribute Class (System.Runtime.CompilerServices) - https://msdn.microsoft.com/en-us/library/system.runtime.compilerservices.callerlinenumberattribute(v=vs.110).aspx
[5]: System.Runtime.CompilerServices Namespace () - https://msdn.microsoft.com/en-us/library/system.runtime.compilerservices(v=vs.110).aspx
[6]: INotifyPropertyChanged Interface (System.ComponentModel) - https://msdn.microsoft.com/en-us/library/system.componentmodel.inotifypropertychanged(v=vs.110).aspx


J

No hay comentarios:

Publicar un comentario

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