Страницы

Поиск по вопросам

пятница, 13 декабря 2019 г.

Что означает эта конструкция с EventHandler?

#c_sharp #события #делегаты #handlers


VS предложил "упростить"

...
EventHandler args = MyHandler
if (args != null)
{
    args(this, e);
}
...


На

...
MyHandler?.Invoke(this, e)
...


Что это значит? Куда копать?
    


Ответы

Ответ 1



В С# 6 появился так называемый null propagation operator. Он позволяет упростить довольно утомительные проверки на null, и означает, что если выражение в его левой части равно null, то он вернёт null, а если оно имеет какое-то другое значение, то будет возвращено значение поля/свойства из правой части, либо будет выполнен метод из правой части. Согласитесь, что писать data = some?.GetData(); явно удобнее, чем if(some != null) data = some.GetData();

Ответ 2



Данная конструкция MyHandler?.Invoke(this, e); логически эквивалентна следующей if ( MyHandler != null ) MyHandler.Invoke(this, e); Такую же конструкцию ввели для оператора индексирования. Например int[] a = null; int? x = a?[0]; a = new int[1] { 10 }; int? b = a?[0]; Это средство появилось в новой версии C# 6.0

Ответ 3



Ключевое слово null является литералом, представляющим пустую ссылку, которая не ссылается ни на один объект. null является значением по умолчанию переменных типа ссылок. Для ключевого слова null определены специальные операторы: int? a; Разрешаем использование null для value type. Вместо int можно указать любой тип значения. obj?.SomeMethod(); Проверяем объект obj на null и, если объект не равен null, обращаемся к члену типа. Также помимо ?. можно обращаться к индексатору ?[]. int y = x ?? -1; Проверяем если x != null, берем его значение, иначе выполняем конструкцию справа от ??, в данном случае устанавливаем y = -1. Также можно комбинировать между собой: int? length = customers?.Length ?? -1; // если customers != null, вернуть customers.Length, иначе вернуть -1

Комментариев нет:

Отправить комментарий