#c_sharp #net
При попытке вернуть из метода return new Size(); вылетает ошибка Do not use default
value type constructor и предлагает заменить строку на return default(Size);. Как бы
не проблема использовать default(T), только хочется понять какая разница?
Ответы
Ответ 1
Вот связанное обсуждение: https://github.com/DotNetAnalyzers/StyleCopAnalyzers/issues/1482. Дело в том, что для структур переопределение конструктора по умолчанию на текущий момент не разрешено. У структур всегда есть начальное значение (инициализированное нулями), которое может представлять собой «плохое», неправильное значение. Например, CancellationToken: его начальное значение совпадает с CancellationToken.None. Если вы используете синтаксис с new, это выглядит так, как будто бы вы создаёте хорошее, пригодное к использованию как и все другие значение. Синтаксис с default позволяет подчеркнуть, что это специальное неинициализированное значение. Заметьте, что это не ошибка компиляции, а предупреждение анализатора стилей. Вы вполне можете отключить его в настройках, оно влияет лишь на читаемость кода. Заметьте, что если разрешат конструкторы структур без параметров, отличие между new T() и default(T) станет более серьёзным: default(T) будет означать неинициализированное, прописанное нулями значение, а конструктор сможет выполнить добавочную инициализацию.Ответ 2
Данный оператор нужен, чтобы получить значение по умолчанию null - для ссылочных типов 0 или структуру, для типов-значений. В MSVS 2013, все работает без предупреждений. Судя по всему, в анализаторы кода новых студий добавили данное правило В принципе выглядит вполне резонно, учитывая, что у структур не может быть конструктора без параметров. И так как результат вызовов default(Size) и new Size() абсолютно одинаковый, вызов default может казаться более логичным. Из комментария @VladD: Первичная цель существования default(T) — шаблоны. В шаблоне программист не знает, есть ли у T значение null, и есть ли конструктор без параметров. А вот default(T) есть всегда.
Комментариев нет:
Отправить комментарий