Compartir a través de


Información del autor de la llamada (Visual Basic)

Mediante los atributos de información del llamador, se puede obtener información sobre el llamador de un método. 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 la creación de herramientas de diagnóstico.

Para obtener esta información, se usan atributos que se aplican a parámetros opcionales, cada uno de los cuales tiene un valor predeterminado. En la tabla siguiente se enumeran los atributos de información del llamante que se definen en el System.Runtime.CompilerServices espacio de nombres:

Atributo Descripción Tipo
CallerFilePathAttribute Ruta de acceso completa del archivo de código fuente que contiene el llamador. Esta es la ruta de acceso del archivo en tiempo de compilación. String
CallerLineNumberAttribute Número de línea del archivo de origen donde se llama al método. Integer
CallerMemberNameAttribute Método o nombre de propiedad del llamador. Consulte Nombres de miembros más adelante en este tema. String
CallerArgumentExpressionAttribute Expresión usada por la persona que llama para un argumento. Consulte Expresiones del llamante más adelante en este tema. String

Ejemplo

En el ejemplo siguiente se muestra cómo usar 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.

Private Sub DoProcessing()  
    TraceMessage("Something happened.")  
End Sub  
  
Public Sub TraceMessage(message As String,  
        <System.Runtime.CompilerServices.CallerMemberName> Optional memberName As String = Nothing,  
        <System.Runtime.CompilerServices.CallerFilePath> Optional sourcefilePath As String = Nothing,  
        <System.Runtime.CompilerServices.CallerLineNumber()> Optional sourceLineNumber As Integer = 0)  
  
    System.Diagnostics.Trace.WriteLine("message: " & message)  
    System.Diagnostics.Trace.WriteLine("member name: " & memberName)  
    System.Diagnostics.Trace.WriteLine("source file path: " & sourcefilePath)  
    System.Diagnostics.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  

Observaciones

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

Los atributos De información del autor de la llamada no hacen que un parámetro sea opcional. En su lugar, influyen en el valor predeterminado que se utiliza cuando se omite el argumento.

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

Puede proporcionar explícitamente los argumentos opcionales para controlar la información del autor de la llamada o ocultar la información del autor de la llamada.

Nombres de miembro

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

  • Uso de rutinas de seguimiento y diagnóstico.

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

En el gráfico siguiente se muestran los nombres de miembro que se devuelven al usar el CallerMemberName atributo .

Las llamadas se producen en Resultado del nombre de miembro
Método, propiedad o evento Nombre del método, propiedad o evento desde el que se originó la llamada.
Constructor Cadena ".ctor"
Constructor estático Cadena ".cctor"
Destructor Cadena "Finalize"
Operadores o conversiones definidos por el usuario Nombre generado para el miembro, por ejemplo, "op_Addition".
Constructor de atributos 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), este resultado es el nombre del miembro asociado a ese elemento.
Ningún miembro contenedor (por ejemplo, nivel de ensamblado o atributos que se aplican a tipos) Valor predeterminado del parámetro opcional.

Expresiones del autor de la llamada

Se usa System.Runtime.CompilerServices.CallerArgumentExpressionAttribute cuando se desea capturar la expresión usada para un argumento. Es posible que las bibliotecas de diagnóstico quieran proporcionar más detalles sobre las expresiones pasadas como argumentos. Al proporcionar la expresión que desencadenó el diagnóstico, además del nombre del parámetro, los desarrolladores tienen más detalles sobre la condición que desencadenó el diagnóstico. Esa información adicional facilita la corrección. El método siguiente usa CallerArgumentExpressionAttribute para mostrar la condición que debe ser True:

Public Shared Sub ValidateArgument(ByVal parameterName As String,
ByVal condition As Boolean,
<CallerArgumentExpression("condition")> ByVal Optional message As String? = Nothing)
    If Not condition Then
        Throw New ArgumentException($"Argument failed validation: <{message}>", parameterName)
    End If
End Sub

Consulte también