Сведения о вызывающем (C# и Visual Basic)

С помощью информационных атрибутов вызывающего объекта можно получить сведения об вызывающем объекте для метода.Можно получить путь к файлу исходного кода, номер строки в исходном коде и имя вызывающего объекта.Эти сведения полезны для трассировки, отладки и создания средств диагностики.

Для получения этих сведений используются атрибуты, которые применяются к необязательным параметрам, каждый из которых имеет значение по умолчанию.В следующей таблице перечислены информационные атрибуты вызывающего объекта, которые определены в пространстве имен System.Runtime.CompilerServices:

Атрибут

Описание

Тип

CallerFilePathAttribute

Полный путь исходного файла, содержащего вызывающий объект.Это путь к файлу во время компиляции.

String

CallerLineNumberAttribute

Номер строки в исходном файле, в которой вызывается метод.

Integer

CallerMemberNameAttribute

Имя свойства или метода вызывающего объекта.См. Member Names ниже в данном разделе.

String

Пример

В следующем примере показано, как использовать информационные атрибуты вызывающего объекта.При каждом вызове метода TraceMessage сведения о вызывающем объекте подставляются в качестве аргументов необязательным параметрам.

' Imports System.Runtime.CompilerServices
' Imports System.Diagnostics

Private Sub DoProcessing()
    TraceMessage("Something happened.")
End Sub

Public Sub TraceMessage(message As String,
        <CallerMemberName> Optional memberName As String = Nothing,
        <CallerFilePath> Optional sourcefilePath As String = Nothing,
        <CallerLineNumber()> Optional sourceLineNumber As Integer = 0)

    Trace.WriteLine("message: " & message)
    Trace.WriteLine("member name: " & memberName)
    Trace.WriteLine("source file path: " & sourcefilePath)
    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
// using System.Runtime.CompilerServices
// using System.Diagnostics;

public void DoProcessing()
{
    TraceMessage("Something happened.");
}

public void TraceMessage(string message,
        [CallerMemberName] string memberName = "",
        [CallerFilePath] string sourceFilePath = "",
        [CallerLineNumber] int sourceLineNumber = 0)
{
    Trace.WriteLine("message: " + message);
    Trace.WriteLine("member name: " + memberName);
    Trace.WriteLine("source file path: " + sourceFilePath);
    Trace.WriteLine("source line number: " + sourceLineNumber);
}

// Sample Output:
//  message: Something happened.
//  member name: DoProcessing
//  source file path: c:\Users\username\Documents\Visual Studio 2012\Projects\CallerInfoCS\CallerInfoCS\Form1.cs
//  source line number: 31

Заметки

Для каждого необязательного параметра необходимо указать явное значение по умолчанию.Нельзя применять информационные атрибуты вызывающего объекта к параметрам, которые не были указаны как необязательные.

Информационные атрибуты вызывающего объекта не делают параметр необязательным.Вместо этого они влияют на значение по умолчанию, которое передается, если аргумент был опущен.

Информационные значения вызывающего объекта передаются как литералы в IL во время компиляции.В отличие от результатов свойства StackTrace для исключений, результаты не затрагиваются запутыванием кода.

Hh534540.collapse_all(ru-ru,VS.110).gifИмена членов

Можно использовать атрибут CallerMemberName, чтобы избежать указания имени члена как аргумента String вызванному методу.С помощью этого приема можно избежать проблемы, заключающеся в том, что Рефакторинг по переименованию не изменяет значения String.Эта преимущество особенно полезно для выполнения следующих задач:

  • Использование трассировки и контрольных программ.

  • Реализация интерфейса INotifyPropertyChanged при привязке данных.Этот интерфейс позволяет свойству объекта уведомлять связанный элемент управления об изменении свойства, так что элемент управления может отображать обновленные сведения.Без атрибута CallerMemberName необходимо указать имя свойства как литерал.

На следующем рисунке показаны имена членов, которые возвращаются при использовании атрибута CallerMemberName.

Вызовы происходят в пределах

Результат имени члена

Метода, свойста или события

Имя метода, свойства или события, из которого происходил вызов.

Конструктора

Строка ".ctor"

Статического конструктора

Строка ".cctor"

Деструктора

Строка "Finalize"

Определяемых пользователем операторов и преобразований

Созданное имя члена, например, "op_Addition".

Конструктора атрибута

Имя члена, к которому применяется атрибут.Если атрибут — любой элемент внутри члена (например, параметр или возвращаемое значение или параметр универсального типа), то этот результат — имя члена, который связан с этим элементом.

Нет содержащего члена (например, уровень сборки или атрибуты, примененные к типу)

Значение необязательного параметра по умолчанию.

См. также

Ссылки

Атрибуты (C# и Visual Basic)

Основные понятия

Общие атрибуты (C# и Visual Basic)

Необязательные параметры (Visual Basic)

Именованные и необязательные аргументы (Руководство по программированию на C#)

Другие ресурсы

Основные понятия программирования