Informazioni sul chiamante (Visual Basic)

Gli attributi di informazioni sul chiamante consentono di ottenere informazioni sul chiamante di un metodo. È possibile ottenere il percorso del file del codice sorgente, il numero di riga nel codice sorgente e il nome del chiamante. Queste informazioni sono utili per la tracciatura, il debug e la creazione di strumenti diagnostici.

Per ottenere queste informazioni, utilizzare gli attributi applicati ai parametri facoltativi, a ognuno dei quali è associato un valore predefinito. Nella tabella seguente sono elencati gli attributi di informazioni sul chiamante definiti nello spazio dei nomi System.Runtime.CompilerServices:

Attributo Descrizione Tipo
CallerFilePathAttribute Percorso completo del file di origine contenente il chiamante. Si tratta del percorso del file al momento della compilazione. String
CallerLineNumberAttribute Numero di riga nel file di origine in cui viene chiamato il metodo. Integer
CallerMemberNameAttribute Nome di una proprietà o di un metodo del chiamante. Vedere Nomi dei membri più avanti in questo argomento. String
CallerArgumentExpressionAttribute Espressione utilizzata dal chiamante per un argomento. Vedere Espressioni chiamante più avanti in questo argomento. String

Esempio

Nell'esempio seguente viene illustrato come utilizzare gli attributi di informazioni sul chiamante. Per ogni chiamata al metodo TraceMessage, le informazioni sul chiamante vengono sostituite come argomenti dei parametri facoltativi.

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  

Osservazioni:

È sempre necessario specificare un valore esplicito per ciascun parametro facoltativo. Non è possibile applicare attributi di informazioni sul chiamante ai parametri non specificati come facoltativi.

Gli attributi di informazioni sul chiamante non restituiscono un parametro facoltativo, ma influiscono sul valore predefinito passato quando l'argomento è omesso.

I valori delle informazioni sul chiamante vengono generati come valori letterali in Intermediate Language (IL) in fase di compilazione. A differenza dei risultati della proprietà StackTrace per le eccezioni, i risultati non sono interessati da offuscamento.

È possibile fornire esplicitamente gli argomenti facoltativi per esaminare o nascondere le informazioni sul chiamante.

Nomi dei membri

È possibile utilizzare l'attributo CallerMemberName per specificare il nome del membro come argomento String al metodo chiamato. Usando questa tecnica, si evita il problema per cui il refactoring di ridenominazione non modifica i valori String. Questo vantaggio è particolarmente utile per le attività seguenti:

  • Utilizzo della tracciatura e delle routine di diagnostica.

  • Implementazione dell'interfaccia INotifyPropertyChanged durante l'associazione dei dati. Questa interfaccia consente alla proprietà di un oggetto di notificare a un controllo associato la modifica della proprietà stessa in modo che il controllo possa visualizzare le informazioni aggiornate. Senza l'attributo CallerMemberName, è necessario specificare il nome della proprietà come valore letterale.

Nel grafico seguente vengono mostrati i nomi dei membri restituiti quando si utilizza l'attributo CallerMemberName.

Elemento in cui si verificano le chiamate Nome del membro restituito
Metodo, proprietà o evento Nome del metodo, della proprietà o dell'evento da cui la chiamata ha avuto origine.
Costruttore Stringa ".ctor"
Costruttore statico Stringa ".cctor"
Distruttore Stringa "Finalize"
Operatori o conversioni definiti dall'utente Nome generato per il membro, ad esempio "op_Addition".
Costruttore dell'attributo Nome del membro a cui viene applicato l'attributo. Se l'attributo è un qualsiasi elemento in un membro (ad esempio un parametro, un valore restituito o un parametro di tipo generico), il risultato è il nome del membro associato a tale elemento.
Nessun membro contenitore (ad esempio a livello di assembly o attributi applicati a tipi) Valore predefinito del parametro facoltativo.

Espressioni chiamante

Usare System.Runtime.CompilerServices.CallerArgumentExpressionAttribute quando si desidera acquisire l'espressione usata per un argomento. È possibile che le librerie di diagnostica forniscano altri dettagli sulle espressioni passate come argomenti. Fornendo l'espressione che ha attivato la diagnostica, oltre al nome del parametro, gli sviluppatori hanno maggiori dettagli sulla condizione che ha attivato la diagnostica. Queste informazioni aggiuntive semplificano la correzione. Il metodo seguente usa CallerArgumentExpressionAttribute per visualizzare la condizione che deve essere 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

Vedi anche