Должен ли я считать, что отправитель может быть нулевым? - PullRequest
3 голосов
/ 31 мая 2019

Должен ли я считать sender (из обработчика события CLR) или d (из обработчика события зависимости) равным null и написать некоторый код для этого случая? Или я могу просто пометить их как [NotNull] и игнорировать предупреждения?

Я использую VS2019 + ReShaper для создания проекта на C #. Когда «Режим анализа значений» для R # установлен на «Пессимистичный (предполагается, что объект не имеет явного атрибута NotNull)», он предупреждает, что sender и d могут быть null.

//// R# warns sender can be null.
private void OnSomethingHappened(object sender, EventArgs e) {
    //// Should I throw an Exception when sender is null?
    //// Or can I simply mark sender as [NotNull]?
}

//// R# warns d can be null.
private static void (DependencyObject d, DependencyPropertyChangedEventArgs e) 
{
    //// Should I throw an Exception when d is null?
    //// Or can I simply mark d as [NotNull]?
}

Ответы [ 2 ]

1 голос
/ 31 мая 2019

Все рекомендуют мне проверить, чтобы объект был нулевым. Итак, IMO, это было бы наилучшей практикой, если бы я хотел использовать sender (или d) в методе.

    private void OnSomethingHappened([CanBeNull]object sender, EventArgs e) {
        if (!(sender is MyClass mc)) throw new ArgumentException();

        mc.DoSomething();        
    }

EDIT: Теперь я предпочитаю это:

    private void OnSomethingHappened([CanBeNull]object sender, EventArgs e) {
        var mc = sender as MyClass ?? throw new ArgumentException();

        mc.DoSomething();        
    }
0 голосов
/ 31 мая 2019

Всегда безопасно писать нулевые проверки:

if(objectThatShouldNotBeNull == null)
{
  AppropriateAction();
  // if necessary
  return;
}

Как правило, если он используется позже в коде, IMO его нужно проверять на значение null.

Особенно когда иногдаВы или другие разработчики, возможно, захотите вызвать этот метод из кода (я делаю это иногда, а затем следую шаблону abocve) и установите sender в null.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...