0Pricing
C# Academy · Урок

Информация на уровне исходного кода (атрибуты Caller)

Используйте CallerMemberName, CallerFilePath и CallerLineNumber для получения информации о месте вызова в журналах, защитных проверках и уведомлениях об изменении свойств.

«Информация на уровне исходного кода (атрибуты Caller)» — бесплатный урок C# Academy на CoddyKit. Это урок 2 из 3. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения C# Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс C# Academy содержит 3 уроков всего.

Зачем нужны сведения о вызывающем коде

Цель: автоматически получать сведения о месте вызова.

  • CallerMemberName — кто выполнил вызов
  • CallerFilePath — какой файл
  • CallerLineNumber — какая строка
  • Полезно для журналов, проверок и уведомлений

Имя члена для журналов

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

using System;
using System.Runtime.CompilerServices;

public static class Log
{
  // Caller fills "member" automatically if not provided
  public static void Info(string msg, [CallerMemberName] string member = null)
  {
    Console.WriteLine("[" + (member ?? "?") + "] " + msg);
  }
}

public class Program
{
  static void DoWork() { Log.Info("started"); }

  public static void Main(string[] args)
  {
    Log.Info("app boot");
    DoWork(); // prints caller method name
  }
}

Сведения о файле и строке

Добавьте CallerFilePath и CallerLineNumber для точной диагностики.

using System;
using System.Runtime.CompilerServices;

public static class Diag
{
  public static void Trace(string msg,
    [CallerFilePath] string file = null,
    [CallerLineNumber] int line = 0,
    [CallerMemberName] string member = null)
  {
    Console.WriteLine(file + ":" + line + " in " + member + " -> " + msg);
  }
}

public class Program
{
  static void Step() { Diag.Trace("stepping"); }

  public static void Main(string[] args)
  {
    Diag.Trace("start");
    Step();
  }
}

Уведомления об изменении свойств

Используйте CallerMemberName в средствах установки значений или вспомогательных методах событий, чтобы не указывать строки вручную.

using System;
using System.Runtime.CompilerServices;

public class Person
{
  private string _name;

  // Notify helper uses CallerMemberName so callers need not pass the property name
  void Notify([CallerMemberName] string property = null)
  {
    Console.WriteLine("Changed: " + property);
  }

  public string Name
  {
    get { return _name; }
    set { _name = value; Notify(); } // property name auto-filled
  }
}

public class Program
{
  public static void Main(string[] args)
  {
    Person p = new Person();
    p.Name = "Ada"; // prints "Changed: Name"
  }
}

Проверки с именем вызывающего кода

Сведения о вызывающем коде делают сообщения проверок понятнее без ручного указания строк.

using System;
using System.Runtime.CompilerServices;

public static class Guard
{
  public static void NotNull(object x, [CallerMemberName] string caller = null)
  {
    if (x == null) throw new ArgumentNullException("value", "Null passed by " + (caller ?? "?"));
  }
}

public class Program
{
  static void Save(string path)
  {
    Guard.NotNull(path); // if null, message includes "Save"
    Console.WriteLine("Saving to " + path);
  }

  public static void Main(string[] args)
  {
    try
    {
      Save(null);
    }
    catch (Exception ex)
    {
      Console.WriteLine(ex.Message);
    }
  }
}

Советы и примечания

Примечания:

  • Атрибуты вызывающего кода работают с необязательными параметрами, имеющими значения по умолчанию.
  • Не полагайтесь на точные пути к файлам для защиты секретов: пути могут раскрыть структуру папок.
  • Это полезно для ведения журналов, диагностики и событий изменения свойств.

Атрибут имени вызывающего кода

Быстрая проверка: какой attribute позволяет методу получить имя вызывающего его кода в качестве значения параметра по умолчанию?

Повторение

Повторение: добавьте CallerMemberName, CallerFilePath и CallerLineNumber к необязательным параметрам, чтобы без дополнительных усилий получать контекст вызывающего кода.

Часто задаваемые вопросы

Урок «Информация на уровне исходного кода (атрибуты Caller)» бесплатный?

Да — полный текст урока «Информация на уровне исходного кода (атрибуты Caller)» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс C# Academy, подпишись на CoddyKit PRO. Курс C# Academy содержит 3 уроков всего.

Чему я научусь в уроке «Информация на уровне исходного кода (атрибуты Caller)»?

Используйте CallerMemberName, CallerFilePath и CallerLineNumber для получения информации о месте вызова в журналах, защитных проверках и уведомлениях об изменении свойств. Ты практикуешь C# Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать C# Academy?

Предыдущий опыт не требуется. C# Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 3.

Сколько времени занимает урок «Информация на уровне исходного кода (атрибуты Caller)»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке C# Academy?

Да. Каждый урок C# Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Type, MethodInfo, активация и пользовательские атрибуты
  2. Информация на уровне исходного кода (атрибуты Caller)
  3. Сценарии легкого метапрограммирования
← Назад к C# Academy