Müssen Sie das Schlüsselwort "new" in Dart verwenden?

90

In meiner Dart-basierten Anwendung habe ich gerade bemerkt, dass ich das weglassen kann new Schlüsselwort und alles einwandfrei funktioniert.

Anstelle final widget = new Widget();kann ich auch verwendenfinal widget = Widget(); .

Hat dies Auswirkungen auf den Code?

CreativeCreatorormaybenot
quelle

Antworten:

112

Nein, tut es nicht. Mit Dart 2 (klicken Sie für die Ankündigung mit weiteren Informationen) wurden die Schlüsselwörter newund auch optional gemacht .const

Dies bedeutet, dass new Widget()dies genau das Gleiche tut wie Widget()für sich.


Das constSchlüsselwort kann jedoch einen Wert ändern, der nicht constimplizit a ist const.
Sie müssen also constbei Bedarf explizit angeben .

CreativeCreatorormaybenot
quelle
6
Das Dart-Team musste sich vorerst etwas zurückziehen und es gibt Situationen, in denen newoder constdie noch erforderlich sind (ich erinnere mich nicht an Beispiele oder Regeln). Sie könnten nach Dart 2 einen weiteren Versuch unternehmen, es überall optional zu machen.
Günter Zöchbauer
1
Es gibt keine Orte, an denen dies newerforderlich ist. Wenn Sie newein korrektes Programm weglassen , funktioniert es immer auf die gleiche Weise. Wenn Sie entfernen constaus einem Arbeitsprogramm, dann in den meisten Fällen , in denen Sie sich haben , schreiben constfür das Programm gültig ist, wird es nach wie vor gültig. Immer wenn constder Ausdruck bereits umgeben ist, können Sie die verschachtelte Konstante weglassen.
18.
20

Wenn Sie in Dart 2 einen Konstruktor wie eine Funktion ohne newoder constvor aufrufen , entspricht dies der Verwendung new. Wenn Sie einen const-Aufruf wünschen, sollten Sie setzenconst .

Innerhalb eines const-Ausdrucks müssen Sie nicht consterneut schreiben , und in einigen Kontexten, in denen const-Ausdrücke erforderlich sind (z. B. Switch-Case-Ausdrücke und Initialisierer von const-Variablen), benötigen Sie nicht einmal die äußere const.

Sie müssen also nie schreiben new.

Das Dart-Sprachteam möchte zulassen, dass Ausdrücke, in die Sie entweder einfügen können newoder bei constdenen der Aufruf korrekt ist (dh ein const-Konstruktor mit konstanten Argumenten), standardmäßig constanstelle von neweingefügt werden, hoffentlich in einem frühen Update von Dart 2. Aus diesem Grund , empfehle ich schreibe newes vor Object(), oder jede andere const Konstruktor , wo Sie müssen das Objekt eine neue Instanz sein. Dies ist ein sehr seltener Fall. Normalerweise interessiert Sie die Identität Ihres unveränderlichen Objekts nicht (weshalb das Einfügen constals gute Idee angesehen wird).

lrn
quelle
4

Das newSchlüsselwort wurde in Dart 2 optional gemacht. Ab sofort gibt der Aufruf einer Klasse immer eine neue Instanz dieser Klasse zurück. Gemäß meiner Empfehlung können Sie es ( NICHT OBLIGATORISCH ) außerhalb einer Layoutdefinition verwenden, aber in Layouts weglassen.

Ein weiterer Punkt, den ich teilen möchte mit dir ist , dass , wenn Sie verwenden newoder constKeyword während deklarieren Widgets , Sie sind auch in der Lage das sehen + Symbol , das Sie den Widget Körper Code reduzieren und erweitern können. Dies ist nützlich, wenn Sie den restlichen Widget-Code in der Dart-Datei reduzieren / ausblenden möchten, während Sie an einem anderen Widget-Code in derselben Datei arbeiten.

Rahul Sharma
quelle
Guter Fang für diese Kollaps-Sache
MoGa
2
Das Kollapsverhalten wäre IDE-spezifisch. Sie sollten explizit angeben, für welche es gilt.
Jamesdlin
1
Außerdem gibt "Aufrufen einer Klasse" (womit Sie vermutlich "den Konstruktor einer Klasse aufrufen" meinen) nicht immer eine neue Instanz der Klasse zurück. Wenn Sie einen Factory- Konstruktor aufrufen , erhalten Sie möglicherweise eine vorhandene Instanz zurück. Aus diesem Grund newwird davon abgeraten: Wenn Sie es verwenden, sieht es so aus, als würde es bedingungslos eine neue Instanz erstellen, wenn dies nicht der Fall ist.
Jamesdlin