VS предложил "упростить"
...
EventHandler<MyEventArgs> args = MyHandler
if (args != null)
{
args(this, e);
}
...
На
...
MyHandler?.Invoke(this, e)
...
Что это значит? Куда копать?
В С# 6 появился так называемый null propagation operator. Он позволяет упростить довольно утомительные проверки на null, и означает, что если выражение в его левой части равно null, то он вернёт null, а если оно имеет какое-то другое значение, то будет возвращено значение поля/свойства из правой части, либо будет выполнен метод из правой части. Согласитесь, что писать
data = some?.GetData();
явно удобнее, чем
if(some != null)
data = some.GetData();
Данная конструкция
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
Ключевое слово 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
Сборка персонального компьютера от Artline: умный выбор для современных пользователей