Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
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