Вопрос по синтаксису вызова делегата в c#

В общем, имеются в программе события, одно из них-CollectionCountChanged, которое генерируется функцией OnCollectionCountChanged:

public void OnCollectionCountChanged(object source, CollectionEventHandlerArgs args)
    {
        if (CollectionCountChanged != null) CollectionCountChanged(source, args);
    }

Visual Studio предлагает упростить вызов делегата:

 public void OnCollectionCountChanged(object source, CollectionEventHandlerArgs args)
    {
        CollectionCountChanged?.Invoke(source, args);
    }

Кто-то может объяснить, что делает эта шляпа? Ну или конкретно, что здесь делает "?". Благодарю заранее :)


Ответы (1 шт):

Автор решения: CrazyElf
CollectionCountChanged?.Invoke(source, args);

Такая конструкция эквивалентна следующей:

if(CollectionCountChanged != null)
{
    CollectionCountChanged.Invoke(source, args);
}

Бывает особенно удобно, когда через точку много сущностей перечислено, чтобы не проверять каждую из них на null по очереди:

LevelOne?.LevelTwo?.LevelThree?...
→ Ссылка