web-dev-qa-db-fra.com

Différence entre type "var" et "dynamique" 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 et var? Quand utiliser?

48
Gero

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

var est un mot-clé, ce qui signifie "Je me fiche de noter quel type est ici." Dart remplacera le mot clé var par le type d'initialisation, ou le laissera dynamic par défaut s'il n'y a pas d'initialiseur.

Utilisez var si vous vous attendez à ce qu'une affectation de variable change au cours de sa durée de vie:

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

Utilisez final si vous vous attendez à ce qu'une affectation de variable reste la même pendant sa durée de vie:

final msg = "Hello world.";

L'utilisation de final (libéralement) vous aidera à détecter les situations où vous changez accidentellement l'affectation d'une variable alors que vous ne le vouliez pas.

Notez qu'il existe une fine distinction entre final et const en ce qui concerne les objets. final ne rend pas nécessairement l'objet lui-même immuable, alors que const le 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"];
35
John Evans

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 a.

16
rough

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

Dart Editor est suffisamment intelligent pour connaître le type exact dans certaines situations. Par exemple, les deux instructions suivantes sont similaires dans l'éditeur si vous avez activé "Utiliser les informations de type déduites pour les vérifications de type" dans les préférences:

var a = "abc";    // type of variable is dynamic,
                  // but editor can infer it is a string
String a = "abc"; // type of variable is String

D'autre part, dynamic est un type spécial indiquant qu'il peut être de n'importe quel type (aka classe). Par exemple, en convertissant un objet en dynamic, vous pouvez appeler 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
7
Tom Yeh
var a ;
a = 123;
print(a is int);
print(a);
a = 'hal';
print(a is String);

Lorsqu'il est défini sans valeur initiale, 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 la valeur initiale, var est int dans ce cas.

2
John Wang

Un aspect que l'on peut considérer en comparaison dynamique vs var tient compte du comportement lors de l'utilisation de la déclaration var avec initialisation en même temps, il n'y a pas de possibilité de changer type qui en cas de dynamique est.

Mais dynamique vs var n'est pas la question que je demanderais. Je demanderais plus quelle est la différence entre dynamique et objet .

Voici un annoter avec objet au lieu de dynamique pour indiquer que tout objet est autorisé.

Il est difficile de le ressentir au début, mais dynamique je me rapporterais à l'argument de type générique.

0
MagGGG