Информация на уровне исходного кода (атрибуты 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);
}
}
}
Советы и примечания
Примечания:
- Атрибуты вызывающего кода работают с необязательными параметрами, имеющими значения по умолчанию.
- Не полагайтесь на точные пути к файлам для защиты секретов: пути могут раскрыть структуру папок.
- Это полезно для ведения журналов, диагностики и событий изменения свойств.
Атрибут имени вызывающего кода
Повторение
Повторение: добавьте 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 — локальная установка не требуется.
Все уроки этого курса
- Type, MethodInfo, активация и пользовательские атрибуты
- Информация на уровне исходного кода (атрибуты Caller)
- Сценарии легкого метапрограммирования