Страницы

Поиск по вопросам

вторник, 18 декабря 2018 г.

Зачем нужен оператор default(T)?

При попытке вернуть из метода return new Size(); вылетает ошибка Do not use default value type constructor и предлагает заменить строку на return default(Size);. Как бы не проблема использовать default(T), только хочется понять какая разница?


Ответ

Вот связанное обсуждение: https://github.com/DotNetAnalyzers/StyleCopAnalyzers/issues/1482
Дело в том, что для структур переопределение конструктора по умолчанию на текущий момент не разрешено. У структур всегда есть начальное значение (инициализированное нулями), которое может представлять собой «плохое», неправильное значение. Например, CancellationToken: его начальное значение совпадает с CancellationToken.None
Если вы используете синтаксис с new, это выглядит так, как будто бы вы создаёте хорошее, пригодное к использованию как и все другие значение. Синтаксис с default позволяет подчеркнуть, что это специальное неинициализированное значение.

Заметьте, что это не ошибка компиляции, а предупреждение анализатора стилей. Вы вполне можете отключить его в настройках, оно влияет лишь на читаемость кода.

Заметьте, что если разрешат конструкторы структур без параметров, отличие между new T() и default(T) станет более серьёзным: default(T) будет означать неинициализированное, прописанное нулями значение, а конструктор сможет выполнить добавочную инициализацию.

Комментариев нет:

Отправить комментарий