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

327
25 декабря 2016, 18:34

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

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

На

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

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

Answer 1

В С# 6 появился так называемый null propagation operator. Он позволяет упростить довольно утомительные проверки на null, и означает, что если выражение в его левой части равно null, то он вернёт null, а если оно имеет какое-то другое значение, то будет возвращено значение поля/свойства из правой части, либо будет выполнен метод из правой части. Согласитесь, что писать

data = some?.GetData();

явно удобнее, чем

if(some != null)
    data = some.GetData();
Answer 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

Answer 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
READ ALSO
Получение значение из другого класса

Получение значение из другого класса

Есть класс (1), в котором содержатся несколько приватных полей (назовем их цена, количество, цвет)Для них уже сделаны геттеры

370
Вытащить переменные из массива

Вытащить переменные из массива

Как вытащить значение 'country' и 'city'

327