Información del llamador (C# y Visual Basic)

Mediante los atributos de información del llamador, se puede obtener información sobre el autor de la llamada a un método.Se puede obtener la ruta de acceso al código fuente, el número de línea en el código fuente y el nombre de miembro del llamador.Esta información es útil para el seguimiento, la depuración y para crear herramientas de diagnóstico.

Para obtener esta información, se usan los atributos que se aplican a los parámetros opcionales, que tienen valores predeterminados.La tabla siguiente enumera los atributos de la información del llamador que se definen en el espacio de nombres System.Runtime.CompilerServices:

Atributo

Descripción

Tipo

[ T:System.Runtime.CompilerServices.CallerFilePathAttribute ]

Ruta de acceso completa del archivo de código fuente que contiene el llamador.Ésta es la ruta de acceso en tiempo de compilación.

String

[ T:System.Runtime.CompilerServices.CallerLineNumberAttribute ]

Número de línea en el archivo de código fuente en el que se llama al método.

Integer

[ T:System.Runtime.CompilerServices.CallerMemberNameAttribute ]

Método o nombre de propiedad del llamador.Consulte Nombres de miembro más adelante en este tema.

String

Ejemplo

El ejemplo siguiente muestra cómo utilizar atributos de información del llamador.En cada llamada al método TraceMessage, la información del llamador se sustituye como argumentos para los parámetros opcionales.

' Imports System.Runtime.CompilerServices
' Imports System.Diagnostics

Private Sub DoProcessing()
    TraceMessage("Something happened.")
End Sub

Public Sub TraceMessage(message As String,
        <CallerMemberName> Optional memberName As String = Nothing,
        <CallerFilePath> Optional sourcefilePath As String = Nothing,
        <CallerLineNumber()> Optional sourceLineNumber As Integer = 0)

    Trace.WriteLine("message: " & message)
    Trace.WriteLine("member name: " & memberName)
    Trace.WriteLine("source file path: " & sourcefilePath)
    Trace.WriteLine("source line number: " & sourceLineNumber)
End Sub

' Sample output:
'   message: Something happened.
'   member name: DoProcessing
'   source file path: C:\Users\username\Documents\Visual Studio 2012\Projects\CallerInfoVB\CallerInfoVB\Form1.vb
'   source line number: 15
// using System.Runtime.CompilerServices
// using System.Diagnostics;

public void DoProcessing()
{
    TraceMessage("Something happened.");
}

public void TraceMessage(string message,
        [CallerMemberName] string memberName = "",
        [CallerFilePath] string sourceFilePath = "",
        [CallerLineNumber] int sourceLineNumber = 0)
{
    Trace.WriteLine("message: " + message);
    Trace.WriteLine("member name: " + memberName);
    Trace.WriteLine("source file path: " + sourceFilePath);
    Trace.WriteLine("source line number: " + sourceLineNumber);
}

// Sample Output:
//  message: Something happened.
//  member name: DoProcessing
//  source file path: c:\Users\username\Documents\Visual Studio 2012\Projects\CallerInfoCS\CallerInfoCS\Form1.cs
//  source line number: 31

Comentarios

Se debe especificar un valor predeterminado explícito para cada parámetro opcional.No se pueden aplicar atributos de información del llamador para los parámetros que no se especifican como opcionales.

Los atributos de información del llamador no crean un parámetro opcional.En cambio, afectan al valor predeterminado que se pasa cuando se omite el argumento.

Los valores de información del llamador se emiten como literales en lenguaje intermedio (IL) en tiempo de compilación.A diferencia de los resultados de la propiedad StackTrace para las excepciones, los resultados no se ven afectados por confusión.

Hh534540.collapse_all(es-es,VS.110).gifNombres de miembro

Se puede utilizar el atributo CallerMemberName para evitar especificar el nombre de miembro como argumento String para el método denominado.Mediante esta técnica, se evita el problema de que Refactorización de cambio de nombre no cambie los valores String.Esta ventaja es especialmente útil para las siguientes tareas:

  • Usar seguimiento y rutinas de diagnóstico.

  • Implementar la interfaz INotifyPropertyChanged al enlazar datos.Esta interfaz permite que la propiedad de un objeto notifique a un control enlazado que la propiedad ha cambiado, de forma que se pueda mostrar información actualizada.Sin el atributo CallerMemberName, se debe especificar el nombre de propiedad como un literal.

El gráfico siguiente muestra los nombres de miembro que se devuelven cuando se utiliza el atributo CallerMemberName.

Las llamadas aparecen dentro

Resultado del nombre de miembro

Método, propiedad, o evento

El nombre del método, propiedad, o el evento desde el que la llamada se originó.

Constructor

La cadena “.ctor”

Constructor estático

La cadena “.cctor”

Un destructor

La cadena “Finalize”

Operadores definidos por el usuario o conversiones

El nombre generado para el miembro, por ejemplo, “op_Addition”.

Constructor de atributo

El nombre del miembro al que se aplica el atributo.Si el atributo es cualquier elemento dentro de un miembro (como un parámetro, un valor devuelto, o un parámetro de tipo genérico), el resultado es el nombre del miembro que está asociado a este elemento.

Ningún miembro contenido (por ejemplo, nivel de ensamblado o atributos que se aplican a tipos)

El valor predeterminado del parametro opcional.

Vea también

Referencia

Atributos (C# y Visual Basic)

Conceptos

Atributos comunes (C# y Visual Basic)

Parámetros opcionales (Visual Basic)

Argumentos opcionales y con nombre (Guía de programación de C#)

Otros recursos

Programar los conceptos