Avez-vous besoin d'utiliser le mot-clé «nouveau» dans Dart?

91

Dans mon application basée sur Dart, je viens de remarquer que je peux omettre le newmot - clé et que tout fonctionne parfaitement bien.

Au lieu de final widget = new Widget();je peux aussi utiliser final widget = Widget();.

Cela a-t-il un effet sur le code?

creativecreatorormaybenot
la source

Réponses:

113

Non. Avec Dart 2 (cliquez pour l'annonce avec plus d'informations) les mots-clés newet aussi constont été rendus facultatifs .

Cela signifie que cela new Widget()fait exactement la même chose que Widget()seul.


Le constmot clé peut cependant changer une valeur qui ne serait pas constimplicitement un const.
Vous devrez donc spécifier explicitement constsi nécessaire.

creativecreatorormaybenot
la source
6
L'équipe Dart a dû se rétracter un peu pour l'instant et il y a des situations où newou constsont encore nécessaires (je ne me souviens pas d'exemples ou de règles). Ils pourraient faire une autre tentative après Dart 2 pour le rendre facultatif partout.
Günter Zöchbauer
1
Il n'y a pas d'endroits où cela newest nécessaire. Si vous omettez newun programme correct, il fonctionnera toujours de la même manière. Si vous supprimez constd'un programme de travail, dans la plupart des cas où vous devrez écrire constpour que le programme soit valide, il sera toujours valide. Chaque fois qu'il existe déjà un constentourage de l'expression, vous pouvez omettre le const imbriqué.
lrn
20

Dans Dart 2, si vous invoquez un constructeur comme une fonction, sans a newou constdevant, alors cela équivaut à utiliser new. Si vous voulez une invocation const, vous devez le mettre constdevant.

Dans une expression const, vous n'avez pas besoin d'écrire à constnouveau, et dans certains contextes qui nécessitent des expressions const (comme les expressions switch case et les initialiseurs de variables const), vous n'avez même pas besoin du const externe.

Vous n'avez donc jamais besoin d'écrire new.

L'équipe de langage Dart veut autoriser les expressions dans lesquelles vous pouvez insérer newou constet avoir toujours l'invocation correcte (c'est-à-dire un constructeur const avec des arguments constants) à insérer par défaut au constlieu de new, espérons-le dans une mise à jour précoce de Dart 2. Pour cette raison , Je recommande de l'écrire newdevant Object(), ou tout autre constructeur const où vous avez besoin que l'objet soit une nouvelle instance. C'est un cas très rare, généralement vous ne vous souciez pas de l'identité de votre objet immuable (c'est pourquoi l'insertion constest considérée comme une bonne idée).

lrn
la source
4

Le newmot-clé a été rendu facultatif dans Dart 2. À partir de maintenant, l'appel d'une classe renverra toujours une nouvelle instance de cette classe. Selon ma recommandation, vous pouvez l'utiliser ( PAS OBLIGATOIRE ) en dehors d'une définition de mise en page, mais l'omettre dans les mises en page internes.

Un autre point que je voudrais partager avec vous est que si vous utilisez newou un constmot - clé lors de la déclaration de widgets , vous pouvez également voir l' icône + que vous pouvez utiliser pour réduire et développer le code du corps du widget. Ceci est utile lorsque vous souhaitez réduire / masquer le code de widget restant dans le fichier de fléchettes tout en travaillant sur un autre code de widget dans le même fichier.

Rahul Sharma
la source
Bonne prise sur cette chose d'effondrement
MoGa
2
Le comportement de réduction serait spécifique à l'IDE. Vous devez indiquer explicitement à quel (s) il s'applique.
jamesdlin
1
De plus, "appeler une classe" (par quoi je suppose que vous voulez dire "invoquer le constructeur d'une classe") ne renvoie pas toujours une nouvelle instance de la classe. Si vous appelez un constructeur de fabrique , vous pouvez récupérer une instance existante . C'est pourquoi il newest déconseillé: son utilisation semble créer inconditionnellement une nouvelle instance alors que ce n'est pas le cas.
jamesdlin