Вам потрібно використовувати ключове слово “new” у Dart?


94

У моїй програмі на базі Dart я щойно помітив, що можу пропустити newключове слово, і все працює чудово.

Замість final widget = new Widget();я також можу використовувати final widget = Widget();.

Чи це впливає на код?

Відповіді:


119

Ні, це не є. З Dart 2 (натисніть для оголошення з додатковою інформацією)new , а також constключовими словами були зроблені по бажанню .

Це означає, що new Widget()робить те саме, що і Widget()самостійно.


Однак constключове слово може змінити значення, яке не буде constявно ім'ям const.
Тож вам доведеться чітко вказати, constколи це потрібно.


6
Наразі команді Дарту довелося трохи відступити, і є деякі ситуації, коли newабо constвсе ще потрібно (я не пам’ятаю прикладів чи правил). Вони можуть зробити ще одну спробу після Dart 2 зробити його необов’язковим скрізь.
Гюнтер Цехбауер,

1
Тут немає місць, де newце потрібно. Якщо ви опустите newправильну програму, вона завжди буде працювати однаково. Якщо ви видалите constз робочої програми, то в більшості випадків, коли вам потрібно було б написати, constщоб програма була дійсною, вона все одно буде дійсною. Щоразу, коли constвираз вже оточує вираз, ви можете пропустити вкладений const.
lrn

20

У Dart 2, якщо ви викликаєте конструктор як функцію, без a newабо constспереду, це еквівалентно використанню new. Якщо ви хочете викликати const, тоді слід поставити constпопереду.

Усередині виразу const вам не потрібно писати constзнову, а в деяких контекстах, які вимагають виразів const (наприклад, вирази регістру перемикачів та ініціалізатори змінних const), вам навіть не потрібен зовнішній const.

Тому вам ніколи не потрібно писати new.

Команда мов Dart хоче дозволити вирази, куди ви можете вставити будь-який newабо, constі все ще мати правильний виклик (тобто конструктор const з постійними аргументами), за замовчуванням вставляти constзамість new, сподіваємось, у ранньому оновленні Dart 2. З цієї причини , Я рекомендую писати newйого перед Object()або будь-яким іншим конструктором const, де вам потрібно, щоб об'єкт був новим екземпляром. Це дуже рідкісний випадок, як правило, вас не хвилює ідентичність вашого незмінного об’єкта (саме тому вставлення constвважається гарною ідеєю).



5

newКлючове слово було зроблено необов'язковим в Dart 2. В даний час, викликаючи клас завжди повертає новий екземпляр цього класу. Відповідно до моєї рекомендації, ви можете використовувати його ( НЕ ОБОВ’ЯЗКОВО ) поза визначенням макета, але опустити всередині макетів.

Ще одним пунктом, яким я хотів би поділитися з вами, є те, що якщо ви використовуєте newабо constключове слово під час оголошення віджетів , ви також можете побачити значок +, який ви можете використовувати для згортання та розширення коду віджета. Це корисно, коли ви хочете згорнути / приховати решту коду віджета у файлі дартса під час роботи над іншим кодом віджета в тому ж файлі.


Хороший улов у цій краху
MoGa

2
Поведінка руйнування буде специфічною для IDE. Ви повинні чітко вказати, до яких з них це стосується.
jamesdlin

1
Крім того, "виклик класу" (під яким я припускаю, що ви маєте на увазі "виклик конструктора класу") не завжди повертає новий екземпляр класу. Якщо ви викликаєте заводський конструктор, ви можете повернути існуючий екземпляр. Ось чому newце не рекомендується: використання схоже на те, що воно беззастережно створює новий екземпляр, коли він може цього не робити.
jamesdlin
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.