TG Telegram Group & Channel
.NET Разработчик | United States America (US)
Create: Update:

День 2274. #ЗаметкиНаПолях
Подробный Обзор CallerMemberName. Окончание
Начало

5. Тип dynamic
Что, если мы вызовем метод SayMyName на экземпляре типа dynamic? Допустим класс CallerMemberNameTests содержит метод SayMyName (определённый в предыдущем посте):

public void CallViaDynamic()
{
Console.WriteLine("Вызов через dynamic:");

dynamic obj = new CallerMemberNameTests();
obj.SayMyName();
}

В этом случае атрибут не работает, и мы получим NULL:
Вызов через dynamic:
Моё имя NULL!

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

6. Обработчики событий
Мы определяем события, но их обработчики выполняются не напрямую:
public void CallViaEvent()
{
Console.WriteLine("Вызов через события:");
var source = new MyEventClass();
source.MyEvent += (sender, e) => SayMyName();
source.TriggerEvent();
}

public class MyEventClass
{
public event EventHandler MyEvent;
public void TriggerEvent() =>
MyEvent?.Invoke(this, EventArgs.Empty);
}

Вывод:
Вызов через события:
Моё имя CallViaEventHandler!

Опять же, всё сводится к тому, как метод генерируется во время компиляции: даже если фактическое выполнение не прямое, во время компиляции параметр инициализируется методом CallViaEvent.

7. Конструктор класса
Наконец, что происходит при вызове из конструктора?
public CallerMemberNameTests()
{
Console.WriteLine("Вызов из конструктора:");
SayMyName();
}

Мы можем рассматривать конструкторы как особый вид методов, но какое у него имя?
Вызов из конструктора 
Моё имя .ctor!

Фактическое имя метода — .ctor! Независимо от имени класса, конструктор считается методом с этим внутренним именем.

Источник: https://www.code4it.dev/csharptips/callermembername-attribute/

День 2274. #ЗаметкиНаПолях
Подробный Обзор CallerMemberName. Окончание
Начало

5. Тип dynamic
Что, если мы вызовем метод SayMyName на экземпляре типа dynamic? Допустим класс CallerMemberNameTests содержит метод SayMyName (определённый в предыдущем посте):
public void CallViaDynamic()
{
Console.WriteLine("Вызов через dynamic:");

dynamic obj = new CallerMemberNameTests();
obj.SayMyName();
}

В этом случае атрибут не работает, и мы получим NULL:
Вызов через dynamic:
Моё имя NULL!

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

6. Обработчики событий
Мы определяем события, но их обработчики выполняются не напрямую:
public void CallViaEvent()
{
Console.WriteLine("Вызов через события:");
var source = new MyEventClass();
source.MyEvent += (sender, e) => SayMyName();
source.TriggerEvent();
}

public class MyEventClass
{
public event EventHandler MyEvent;
public void TriggerEvent() =>
MyEvent?.Invoke(this, EventArgs.Empty);
}

Вывод:
Вызов через события:
Моё имя CallViaEventHandler!

Опять же, всё сводится к тому, как метод генерируется во время компиляции: даже если фактическое выполнение не прямое, во время компиляции параметр инициализируется методом CallViaEvent.

7. Конструктор класса
Наконец, что происходит при вызове из конструктора?
public CallerMemberNameTests()
{
Console.WriteLine("Вызов из конструктора:");
SayMyName();
}

Мы можем рассматривать конструкторы как особый вид методов, но какое у него имя?
Вызов из конструктора 
Моё имя .ctor!

Фактическое имя метода — .ctor! Независимо от имени класса, конструктор считается методом с этим внутренним именем.

Источник: https://www.code4it.dev/csharptips/callermembername-attribute/
👍8


>>Click here to continue<<

.NET Разработчик




Share with your best friend
VIEW MORE

United States America Popular Telegram Group (US)