Condividi tramite


Informazioni sul chiamante (Visual Basic)

Usando gli attributi Info Chiamante, è possibile 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 membro del chiamante. Queste informazioni sono utili per la traccia, il debug e la creazione di strumenti di diagnostica.

Per ottenere queste informazioni, usare gli attributi applicati ai parametri facoltativi, ognuno dei quali ha un valore predefinito. Nella tabella seguente sono elencati gli attributi delle informazioni chiamante definiti nello spazio dei nomi System.Runtime.CompilerServices.

Attributo Descrizione TIPO
CallerFilePathAttribute Percorso completo del file di origine che contiene il chiamante. Questo è il percorso del file in fase di compilazione. String
CallerLineNumberAttribute Numero di riga nel file di origine in cui viene chiamato il metodo . Integer
CallerMemberNameAttribute Nome del metodo o della proprietà del chiamante. Vedere Nomi dei membri più avanti in questo argomento. String
CallerArgumentExpressionAttribute Espressione utilizzata dal chiamante per un argomento. Vedere Espressioni del chiamante più avanti in questo testo. String

Esempio

Nell'esempio seguente viene illustrato come usare gli attributi Informazioni Chiamante. In ogni chiamata al metodo TraceMessage, le informazioni sul chiamante vengono utilizzate come argomenti per i 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:

È necessario specificare un valore predefinito esplicito per ogni parametro facoltativo. Non è possibile applicare gli attributi di informazioni del chiamante ai parametri che non sono specificati come opzionali.

Gli attributi delle informazioni del chiamante non rendono opzionale un parametro. Influiscono invece sul valore predefinito che viene passato quando l'argomento viene omesso.

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

È possibile specificare in modo esplicito gli argomenti facoltativi per controllare le informazioni sul chiamante o nascondere le informazioni sul chiamante.

Nomi dei membri

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

  • Uso di routine di tracciamento e diagnostica.

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

Il grafico seguente mostra i nomi dei membri restituiti quando si usa l'attributo CallerMemberName .

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

Espressioni di chiamata

Quando si utilizza il System.Runtime.CompilerServices.CallerArgumentExpressionAttribute, 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 soddisfatta da 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

Vedere anche