Czy musisz używać słowa kluczowego „nowe” w Dart?

94

W mojej aplikacji opartej na Dart właśnie zauważyłem, że mogę pominąć newsłowo kluczowe i wszystko działa idealnie.

Zamiast tego final widget = new Widget();mogę też użyć final widget = Widget();.

Czy ma to jakiś wpływ na kod?

creativecreatorormaybenot
źródło

Odpowiedzi:

119

Nie. Z Dart 2 (kliknij na ogłoszenie o więcej informacji)new a także constsłowa kluczowe zostały wykonane opcjonalne .

Oznacza to, że new Widget()robi dokładnie to samo, co Widget()samodzielnie.


Słowo constkluczowe może jednak zmienić wartość, która nie byłaby constniejawnie na const.
Będziesz więc musiał wyraźnie określić, constkiedy jest to potrzebne.

creativecreatorormaybenot
źródło
6
Zespół Dart musiał na razie trochę się wycofać i są sytuacje, w których newlub constsą nadal wymagane (nie pamiętam przykładów ani zasad). Mogą podjąć kolejną próbę po Dart 2, aby uczynić ją opcjonalną wszędzie.
Günter Zöchbauer
1
Nie ma miejsc, w których newjest to wymagane. Jeśli pominiesz neww poprawnym programie, będzie on zawsze działał w ten sam sposób. Jeśli usuniesz constz programu pracy, to w większości przypadków, gdzie byś mają napisać constdo programu było ważne, to nadal będzie ważny. Za każdym razem, gdy constwyrażenie jest już otaczające, możesz pominąć zagnieżdżoną stałą.
lrn
20

W Dart 2, jeśli wywołasz konstruktor, taki jak funkcja, bez newlub constz przodu, jest to równoważne użyciu new. Jeśli chcesz wywołać const, powinieneś umieścić constna początku.

Wewnątrz wyrażenia const nie musisz pisać constponownie, aw niektórych kontekstach, które wymagają wyrażeń const (takich jak wyrażenia przełączników wielkości liter i inicjatory zmiennych stałych), nie potrzebujesz nawet zewnętrznej stałej.

Więc nigdy nie musisz pisać new.

Zespół język dart chce zezwolić wyrażeń, gdzie można wstawić albo newalbo consti jeszcze inwokacja być prawidłowe (czyli konstruktor const ze stałych argumentów) domyślnie do wstawiania constzamiast new, z nadzieją na wczesnym aktualizacji do DART 2. Z tego powodu , polecam pisanie newgo przed Object()lub inny const konstruktor gdzie trzeba obiekt będzie nowa instancja. To bardzo rzadki przypadek, zwykle nie przejmujesz się tożsamością niezmiennego obiektu (dlatego wstawianie constjest uważane za dobry pomysł).

lrn
źródło
5

Słowo newkluczowe zostało ustawione jako opcjonalne w Dart 2. Od teraz wywołanie klasy zawsze zwraca nową instancję tej klasy. Zgodnie z moją rekomendacją możesz go używać ( NIE OBOWIĄZKOWE ) poza definicją układu, ale pomijać w układach wewnętrznych.

Jeszcze jedną kwestią, którą chciałbym się z wami podzielić, jest to, że jeśli używasz słowa kluczowego newlub constpodczas deklarowania widżetów , możesz również zobaczyć ikonę +, której możesz użyć do zwinięcia i rozwinięcia kodu treści widżetu. Jest to przydatne, gdy chcesz zwinąć / ukryć resztę kodu widżetu w pliku rzutek podczas pracy nad innym kodem widgetu w tym samym pliku.

Rahul Sharma
źródło
Dobry chwyt na tym upadku
MoGa
2
Zachowanie zwijania byłoby specyficzne dla środowiska IDE. Powinieneś wyraźnie określić, do którego (-ych) ma to zastosowanie.
jamesdlin
1
Ponadto „wywołanie klasy” (przez które, jak zakładam, rozumiesz „wywołanie konstruktora klasy”) nie zawsze zwraca nową instancję klasy. Jeśli wywołasz konstruktora fabryki , możesz odzyskać istniejącą instancję. Dlatego newjest odradzany: używanie go wygląda na to, że bezwarunkowo tworzy nową instancję, gdy może nie.
jamesdlin