695просмотров
41.0%от подписчиков
9 сентября 2025 г.
📷 ФотоScore: 765
🖥 Атрибут CallerArgumentExpression Атрибут может быть использован для того, чтобы указать компилятору на необходимость захвата строкового представления выражения аргумента, переданного методу. Например:
using System.Runtime.CompilerServices; void Function( int value1, TimeSpan value2, [CallerArgumentExpression("value1")] string? expression1 = null, [CallerArgumentExpression("value2")] string? expression2 = null)
{ Console.WriteLine($"{expression1} = {value1}"); Console.WriteLine($"{expression2} = {value2}");
} Нас интересует вызов вышеобъявленной функции:
int myInt = 42;
TimeSpan myTime = TimeSpan.Zero;
Function(myInt, myTime); Вывод:
myInt = 42
myTime = 00:00:00 Самое интересное происходит во время компиляции:
Function(1, default);
Console.WriteLine(); int x = 1;
TimeSpan y = TimeSpan.Zero;
Function(x, y);
Console.WriteLine(); Function(int.Parse("2") + 1 + Math.Max(2, 3), TimeSpan.MaxValue - TimeSpan.Zero);
Console.WriteLine(); Вывод:
1 = 1
default = 00:00:00 x = 1
y = 00:00:00 int.Parse("2") + 1 + Math.Max(2, 3) = 6
TimeSpan.MaxValue - TimeSpan.Zero = 10675199.02:48:05.4775807 Параметр функции expression1 записывается с помощью [CallerArgumentExpression("value1")]. В результате, при вызове функции компилятор возьмёт выражение, переданное в value1 и использует текст этого выражения для expression1. И, аналогично, текст выражения, использованного для value2, будет использован для expression2. Это полезно для:
⏺Тестирования, ибо позволяет получить имена тестируемых переменных и выражений;
⏺Реализации более информативных сообщений при логировании;
⏺Упрощения отладки кода. #Полезно #Attribute