Вам нужно использовать ключевое слово «новое» в Dart?

95

В моем приложении на основе Dart я только что заметил, что могу опустить newключевое слово, и все работает отлично.

Вместо final widget = new Widget();я тоже могу использовать final widget = Widget();.

Это как-то влияет на код?

творческий
источник

Ответы:

120

Нет. С Dart 2 (нажмите для объявления с дополнительной информацией)new , а также constключевыми словами были сделаны по желанию .

Это означает, что он new Widget()делает то же самое, что и сам Widget()по себе.


Однако constключевое слово может изменить значение, которое не было бы constнеявным, на const.
Поэтому вам нужно будет явно указать, constкогда это необходимо.

творческий
источник
6
Команде Dart пришлось пока немного отказаться, и есть некоторые ситуации, в которых newили constони все еще необходимы (я не помню примеров или правил). Они могут предпринять еще одну попытку после Dart 2 сделать его повсюду необязательным.
Günter Zöchbauer
1
Нет мест где newтребуется. Если вы пропустите newправильную программу, она всегда будет работать одинаково. Если вы удалите constрабочую программу, то в большинстве случаев, когда вам придется писать, constчтобы программа была действительной, она все равно будет действительной. Каждый раз, когда constвыражение уже окружено, вы можете опустить вложенную const.
lrn
20

В Dart 2, если вы вызываете конструктор, например функцию, без символа newили constперед ним, это эквивалентно использованию new. Если вам нужен вызов const, вы должны поставить его constвпереди.

Внутри константного выражения вам не нужно писать constснова, а в некоторых контекстах, требующих константных выражений (например, выражения switch case и инициализаторы константных переменных), вам даже не нужна внешняя константа.

Так что вам никогда не нужно писать new.

Команда разработчиков языка Dart хочет разрешить выражения, в которые вы можете вставить либо newили, constно при этом вызов будет правильным (то есть константный конструктор с постоянными аргументами) по умолчанию constвместо вставки new, надеюсь, в раннем обновлении Dart 2. По этой причине , Я рекомендую написать newего перед Object()любым другим конструктором const, где вам нужно, чтобы объект был новым экземпляром. Это очень редкий случай, обычно вы не заботитесь об идентичности вашего неизменяемого объекта (поэтому вставка constсчитается хорошей идеей).

lrn
источник
5

newКлючевое слово было сделано необязательным в Dart 2. В настоящее время, вызывая класс всегда возвращает новый экземпляр этого класса. По моей рекомендации, вы можете использовать его ( НЕ ОБЯЗАТЕЛЬНО ) вне определения макета, но не используйте его внутри макетов.

Еще один момент, которым я хотел бы поделиться с вами, ребята, заключается в том, что если вы используете ключевое слово newили constпри объявлении виджетов , вы также можете увидеть значок +, который вы можете использовать для свертывания и развертывания кода тела виджета. Это полезно, когда вы хотите свернуть / скрыть остальной код виджета в файле dart во время работы над другим кодом виджета в том же файле.

Рахул Шарма
источник
Хороший улов по
поводу
2
Поведение при сворачивании будет зависеть от IDE. Вы должны четко указать, к какому из них это относится.
jamesdlin 02
1
Кроме того, «вызов класса» (под которым, я полагаю, вы подразумеваете «вызов конструктора класса») не всегда возвращает новый экземпляр класса. Если вы вызовете конструктор фабрики , вы можете вернуть существующий экземпляр. Вот почему newэто не рекомендуется: его использование выглядит так, как будто оно безоговорочно создает новый экземпляр, хотя это может не быть.
jamesdlin