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
695
просмотров
1663
символов
Нет
эмодзи
Да
медиа

Другие посты @CSharpHive

Все посты канала →
🖥 Атрибут CallerArgumentExpression Атрибут может быть испол — @CSharpHive | PostSniper