Udostępnij za pomocą


Informacje o wywołującym (Visual Basic)

Za pomocą atrybutów informacji o obiekcie wywołującym można uzyskać informacje o obiekcie wywołującym metodę. Możesz uzyskać ścieżkę pliku kodu źródłowego, numer wiersza w kodzie źródłowym i nazwę członka wywołującego. Te informacje są przydatne w przypadku śledzenia, debugowania i tworzenia narzędzi diagnostycznych.

Aby uzyskać te informacje, należy użyć atrybutów, które są stosowane do parametrów opcjonalnych, z których każda ma wartość domyślną. W poniższej tabeli wymieniono atrybuty "Informacje o wywołującym" zdefiniowane w przestrzeni nazw System.Runtime.CompilerServices.

Atrybut Opis Typ
CallerFilePathAttribute Pełna ścieżka pliku źródłowego zawierającego obiekt wywołujący. Jest to ścieżka pliku w czasie kompilacji. String
CallerLineNumberAttribute Numer wiersza w pliku źródłowym, w którym jest wywoływana metoda. Integer
CallerMemberNameAttribute Nazwa metody lub właściwości obiektu wywołującego. Zobacz Nazwy członków w dalszej części tego tematu. String
CallerArgumentExpressionAttribute Wyrażenie używane przez funkcję wywołującą dla argumentu. Zobacz Wyrażenia wywołujące w dalszej części tego tematu. String

Przykład

W poniższym przykładzie pokazano, jak używać atrybutów informacji o obiekcie wywołującym. Przy każdym wywołaniu metody TraceMessage, informacje o wywołującym są używane jako argumenty dla parametrów opcjonalnych.

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  

Uwagi

Musisz określić jawną wartość domyślną dla każdego opcjonalnego parametru. Nie można zastosować atrybutów informacji o wywołującym do parametrów, jeśli nie są określone jako opcjonalne.

Atrybuty informacji o obiekcie wywołującym nie tworzą parametru opcjonalnego. Zamiast tego mają wpływ na wartość domyślną przekazywaną, gdy argument zostanie pominięty.

Wartości informacji o obiekcie wywołującym są zapisywane jako literały w języku pośrednim (IL) podczas kompilacji. W przeciwieństwie do wyników właściwości dla wyjątków, wyniki nie są wpływane przez zaciemnianie.

Możesz jawnie podać opcjonalne argumenty, aby kontrolować informacje o obiekcie wywołującym lub ukrywać informacje o obiekcie wywołującym.

Nazwy członków

Możesz użyć atrybutu CallerMemberName, aby uniknąć określania nazwy składowej jako argumentu String do wywoływanej metody. Korzystając z tej techniki, unikniesz problemu, że Refaktoryzacja Zmiany Nazwy nie zmienia String wartości. Ta korzyść jest szczególnie przydatna w następujących zadaniach:

  • Korzystanie z procedur śledzenia i diagnostyki.

  • Implementowanie interfejsu INotifyPropertyChanged podczas wiązania danych. Ten interfejs umożliwia właściwości obiektu powiadamianie powiązanej kontrolki o zmianie właściwości, dzięki czemu kontrolka może wyświetlać zaktualizowane informacje. Jeśli nie ma atrybutu CallerMemberName, należy podać nazwę właściwości jako literał.

Na poniższym wykresie przedstawiono nazwy członków zwracane podczas używania atrybutu CallerMemberName.

Wywołania mają miejsce w obrębie Rezultat związany z nazwą członka
Metoda, właściwość lub zdarzenie Nazwa metody, właściwości lub zdarzenia, z którego pochodzi wywołanie.
Konstruktor Ciąg ".ctor"
Konstruktor statyczny Ciąg ".cctor"
Destruktor Ciąg "Finalizuj"
Operatory lub konwersje zdefiniowane przez użytkownika Wygenerowana nazwa dla członka, na przykład "op_Addition".
Konstruktor atrybutu Nazwa członka, do którego atrybut jest stosowany. Jeśli atrybut jest dowolnym elementem w elemencie członkowskim (takim jak parametr, wartość zwracana lub parametr typu ogólnego), ten wynik jest nazwą elementu członkowskiego skojarzonego z tym elementem.
Brak członka zawierającego (na przykład na poziomie zestawu assembly lub atrybutów stosowanych do typów) Wartość domyślna opcjonalnego parametru.

Wyrażenia wywołujące

Używasz elementu System.Runtime.CompilerServices.CallerArgumentExpressionAttribute , gdy chcesz przechwycić wyrażenie używane dla argumentu. Biblioteki diagnostyczne mogą chcieć podać więcej szczegółów na temat wyrażeń, które są podawane jako argumenty. Podając wyrażenie, które wyzwoliło diagnostykę, oprócz nazwy parametru, deweloperzy mają więcej szczegółów na temat warunku, który wyzwolił diagnostykę. Te dodatkowe informacje ułatwiają naprawienie. Poniższa metoda używa CallerArgumentExpressionAttribute do wyświetlania warunku, który musi spełniać 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

Zobacz także