2016-08-15 3 views
2

Я возился с написанием пользовательских исключений и реализацией сериализации для них. Я заметил, что если я null проверить экземпляр SerializationInfo перед доступом к одному из его членов, ReSharper говорит мне, что проверка является избыточной и что, как известно, экземпляр не имеет значения null. Это не тип значения, но выкалывание на Reference Source показало мне, что конструктор по умолчанию отсутствует. Это как ReSharper может сказать, что это не будет null? Есть еще одна причина? Возможно, это ошибка?SerializationInfo Экземпляры никогда не являются нулевыми?

+0

Это уже используется где-то еще в коде перед этим утверждением? –

+0

@BenjaminDrolet - он используется как параметр в конструкторе, который получен из базового конструктора Exception с тем же параметром. Он также используется как параметр в переопределении базового метода GetObjectData. – bubbleking

+1

@bubbleking [this] (http://stackoverflow.com/questions/5067819/how-does-resharper-know-expression-is-always-true), вероятно, отвечает на ваш вопрос – galenus

ответ

0

Я думаю, это потому, что вы вызываете конструктор базового класса Exception. Что-то вроде этого:

protected SomeException(SerializationInfo info, StreamingContext context) 
     : base(info, context) 
    { 
     if (info != null) 
     { 
      // Some work... 
     } 
    } 

Resharper знает, что внутри базы проверки конструктора для информации параметров. Я думаю, что это соответствует официальной документации MSDN:

Исключения:
ArgumentNullException - параметр информации имеет значение NULL.
SerializationException - Имя класса равно null или HResult равен нулю (0).

if (info == null) 
    throw new ArgumentNullException("info"); 

Если базовый конструктор называется, то вы получите значение или исключение.
Так что Resharper говорит, что выражение всегда верно. И на этот раз это правильно, потому что документация, скорее всего, никогда не будет изменена. Но во многих других случаях мне не нравится то, что предлагает Решарпер.

Смежные вопросы