129 votes

Différence entre les types "var" et "dynamic" dans Dart ?

Selon cet article :

Comme vous le savez peut-être, dynamic (comme on l'appelle maintenant) est le type de remplacement lorsqu'une annotation de type statique n'est pas fournie.

Alors, quelle est la différence entre dynamic y var ? Quand l'utiliser ?

145voto

John Evans Points 1511

dynamic est un type qui sous-tend tous les objets Dart. Vous ne devriez pas avoir besoin de l'utiliser explicitement dans la plupart des cas.

var est un mot-clé, signifiant "Je ne me soucie pas de noter ce qu'est le type ici". Dart remplacera le var avec le type d'initialisateur, ou laissez le mot clé dynamic par défaut s'il n'y a pas d'initialisateur.

Utilice var si vous vous attendez à ce que l'affectation d'une variable change au cours de sa durée de vie :

var msg = "Hello world.";
msg = "Hello world again.";

Utilice final si vous souhaitez que l'affectation d'une variable reste la même pendant toute sa durée de vie :

final msg = "Hello world.";

Utilisation de final (généreusement) vous aidera à repérer les situations où vous modifiez accidentellement l'affectation d'une variable alors que vous ne le vouliez pas.

Notez qu'il existe une distinction fine entre final y const quand il s'agit d'objets. final ne rend pas nécessairement l'objet lui-même immuable, alors que const fait :

// can add/remove from this list, but cannot assign a new list to fruit.
final fruit = ["apple", "pear", "orange"];
fruit.add("grape");

// cannot mutate the list or assign a new list to cars.
final cars = const ["Honda", "Toyota", "Ford"];

// const requires a constant assignment, whereas final will accept both:
const names = const ["John", "Jane", "Jack"];

110voto

Mimina Points 1126

dynamique : peut changer TYPE de la variable, & peut changer VALEUR de la variable plus tard dans le code.

var : ne peut pas changer TYPE de la variable, mais peut changer VALEUR de la variable plus tard dans le code.

finale : ne peut pas changer TYPE de la variable, & ne peut pas changer VALEUR de la variable plus tard dans le code.

dynamic v = 123;   // v is of type int.
v = 456;           // changing value of v from 123 to 456.
v = 'abc';         // changing type of v from int to String.

var v = 123;       // v is of type int.
v = 456;           // changing value of v from 123 to 456.
v = 'abc';         // ERROR: can't change type of v from int to String.

final v = 123;       // v is of type int.
v = 456;           // ERROR: can't change value of v from 123 to 456.
v = 'abc';         // ERROR: can't change type of v from int to String.

75voto

rough Points 721

Essayez ceci dans DartPad :

void main() {
  dynamic x = 'hal';
  x = 123;
  print(x);
  var a = 'hal';
  a = 123;
  print(a);
}

vous pouvez changer le type de x, mais pas celui de a.

17voto

Tom Yeh Points 956

var comme final est utilisé pour déclarer une variable. Elle est pas un type du tout.

Dart est assez intelligent pour connaître le type exact dans la plupart des situations. Par exemple, les deux déclarations suivantes sont équivalentes :

String a = "abc"; // type of variable is String
var a = "abc";    // a simple and equivalent (and also recommended) way
                  // to declare a variable for string types

D'un autre côté, dynamic est un type spécial indiquant qu'il peut être n'importe quel type (aka classe). Par exemple, en transformant un objet en dynamic vous pouvez invoquer n'importe quelle méthode (en supposant qu'il y en ait une).

(foo as dynamic).whatever(); //valid. compiler won't check if whatever() exists
(foo as var).whatever(); //illegal. var is not a type

14voto

John Wang Points 91
var a ;
a = 123;
print(a is int);
print(a);
a = 'hal';
print(a is String);

Lorsqu'il est défini sans valeur initiale, le var est dynamique

var b = 321;
print(b is int);
print(b);
//b = 'hal'; //error
print(b is String);

Lorsqu'il est défini avec une valeur initiale, var est int dans ce cas.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X