Unterschied zwischen "var" und "dynamischem" Typ in Dart?

72

Nach diesem Artikel :

Wie Sie vielleicht wissen, ist dynamic(wie es jetzt genannt wird) der Ersatztyp, wenn keine statische Typanmerkung bereitgestellt wird.

Was ist der Unterschied zwischen dynamicund var? Wann verwenden?

Gero
quelle

Antworten:

88

Dynamic ist ein Typ, der allen Dart-Objekten zugrunde liegt. In den meisten Fällen sollten Sie es nicht explizit verwenden müssen.

var ist ein Schlüsselwort und bedeutet "Es ist mir egal, welchen Typ ich hier habe." Dart ersetzt das Schlüsselwort var durch den Initialisierertyp oder lässt es standardmäßig dynamisch, wenn kein Initialisierer vorhanden ist.

Verwenden Sie var, wenn Sie erwarten, dass sich eine Variablenzuweisung während ihrer Lebensdauer ändert:

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

Verwenden Sie final, wenn Sie erwarten, dass eine Variablenzuweisung während ihrer Lebensdauer gleich bleibt:

final msg = "Hello world.";

Die Verwendung von final (großzügig) hilft Ihnen dabei, Situationen zu erfassen, in denen Sie versehentlich die Zuweisung einer Variablen ändern, wenn Sie dies nicht wollten.

Beachten Sie, dass es bei Objekten eine feine Unterscheidung zwischen final und const gibt . final macht das Objekt selbst nicht unbedingt unveränderlich, während const :

// 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"];
John Evans
quelle
1
Warum überhaupt ein var-Schlüsselwort? Machen Sie es einfach zum Standard, wie es Python tut.
Dev Aggarwal
2
↑ Das macht den Compiler schneller, denke ich.
Trần Đức Tâm
3
Vielleicht hat sich das mit Dart 2 geändert (ich kenne Dart 1 nicht). Dies ist eine sehr alte Antwort. In diesem Fall sollte es aktualisiert werden. Beachten Sie auch, dass in Dart 2, wenn das varnicht initialisiert ist, es zu sein scheint dynamic(Sie können zB var foo; foo = "str; foo = 1;(oder vom Typ Objekt?), Dies wäre eine Klärung wert.
Ixx
Er hat nicht einmal nach final oder const gefragt. Wie ist das die akzeptable Antwort ???
Daniel Vilela
48

Versuchen Sie dies in DartPad :

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

Sie können den Typ von x ändern, aber nicht a.

Rau
quelle
8
nur wenn Sie einer var zuordnen. Sie können immer tun: var a; a = "hi"; a = 123; das ist legal.
Ashwin Prabhu
27

dynamisch: Kann den TYP der Variablen ändern und den Wert der Variablen später im Code ändern.

var: Der TYP der Variablen kann nicht geändert werden, der Wert der Variablen kann jedoch später im Code geändert werden.

Finale: kann sich nicht ändern Typ der Variablen, und kann sich nicht ändern Wert der Variablen später im 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.
Mimina
quelle
5
Nur wenn Sie die Variable v initialisieren. Ohne die Initialisierung ist die Variable v dieselbe wie die dynamische v
Ashwin Prabhu
13

varWie finalwird verwendet, um eine Variable zu deklarieren. Es ist überhaupt kein Typ.

Dart ist klug genug, um in den meisten Situationen den genauen Typ zu kennen. Zum Beispiel sind die folgenden zwei Aussagen äquivalent:

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

Auf der anderen Seite dynamichandelt es sich um einen speziellen Typ, der angibt, dass es sich um einen beliebigen Typ (auch als Klasse bezeichnet) handeln kann. Wenn Sie beispielsweise ein Objekt in dynamicumwandeln, können Sie eine beliebige Methode aufrufen (vorausgesetzt, es gibt eine).

(foo as dynamic).whatever(); //valid. compiler won't check if whatever() exists
(foo as var).whatever(); //illegal. var is not a type
Tom Yeh
quelle
4
Technisch gesehen zeigt das erste Beispiel zwei Aussagen, die nicht äquivalent sind. var aErstellt eine Variable vom Typ Dynamisch. String aErstellt eine Variable vom Typ String. Der Dart-Editor führt möglicherweise eine zusätzliche Typinferenz durch, was in diesem Fall der Fall ist. Beachten Sie jedoch, dass dies ein Verhalten ist, das über die Spezifikation hinausgeht.
Seth Ladd
@SethLadd var a = "irgendein String"; Erstellt keine Variable mit dynamischem Typ. Aufgrund des Zuweisungsoperators hat a einen festen String-Typ (in diesem Beispiel).
George 2.0 Hope
10
var a ;
a = 123;
print(a is int);
print(a);
a = 'hal';
print(a is String);

Bei Definition ohne Anfangswert ist var dynamisch

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

Bei der Definition mit dem Anfangswert ist var in diesem Fall int.

John Wang
quelle
4

Um einige der vorherigen Antworten zu verdeutlichen, wenn Sie eine Variable als deklarieren dynamic , ändert sich der Typ je nachdem, was Sie ihr zuweisen. Wenn Sie a deklarieren var, wird der Typ festgelegt, sobald ihm etwas zugewiesen wurde, und kann danach nicht mehr geändert werden.

Zum Beispiel der folgende Code:

dynamic foo = 'foo';
print('foo is ${foo.runtimeType} ($foo)');
foo = 123;
print('foo is ${foo.runtimeType} ($foo)');

gibt das folgende Ergebnis zurück, wenn es in DartPad ausgeführt wird:

foo is String (foo)
foo is int (123)

Der folgende Code wird jedoch nicht einmal kompiliert:

var bar = 'bar';
print('bar is ${bar.runtimeType} ($bar)');
bar = 123; // <-- Won't compile, because bar is a String
print('bar is ${bar.runtimeType} ($bar)');

Lange Rede, kurzer Sinn - verwenden dynamicSie diese Option, wenn Sie eine nicht typisierte Variable möchten. Verwenden Sie diese Option, varwenn Sie eine typisierte Variable mit einem beliebigen Typ möchten, den Sie ihr zuweisen.

Magnus W.
quelle
3

Ein Aspekt, der im Vergleich zwischen dynamisch und var berücksichtigt werden kann, ist die Berücksichtigung des Verhaltens bei gleichzeitiger Verwendung der var-Deklaration mit Initialisierung. Es besteht keine Möglichkeit, den Typ zu ändern, was bei dynamisch der Fall ist.

Aber dynamisch gegen var ist nicht die Frage, die ich stellen würde. Ich würde mehr fragen, was der Unterschied zwischen dynamisch und Objekt ist .

Hier ist eine DO-Annotation mit Objekt anstelle von dynamisch, um anzuzeigen, dass ein Objekt zulässig ist.

Es ist schwer, es am Anfang zu fühlen, aber dynamisch würde ich mich auf generische Typargumente beziehen.

MagGGG
quelle
2

Sowohl in dynamisch als auch in var kann die Variable Daten eines beliebigen Datentyps enthalten, dh int, float, string usw.

Wenn eine Variable als dynamisch deklariert und sogar initialisiert wird, kann sich ihr Typ im Laufe der Zeit ändern. Versuchen Sie diesen Code in https://dartpad.dev/

void main() {
  dynamic x = 'abc';
  x = 12345;
  print(x);

}

Wenn Sie eine Variable als var deklarieren, kann sich der einmal zugewiesene Typ nicht ändern.

void main() {
  var x = 'abc';
  x = 12345;
  print(x);
}

Der obige Code führt zu dem Fehler, dass ein Wert vom Typ 'int' keiner Variablen vom Typ 'String' zugewiesen werden kann - Zeile 3

ABER, wenn Sie eine Variable ohne Initialisierung angeben, wird sie dynamisch:

void main() {
  var x ;
  x = 'abc';
  x=12345;
  print(x);
}
chethanv77777
quelle
0

Eine dynamicVariable kann ihren Typ ändern und ein varTyp kann nicht geändert werden.

Zum Beispiel :

var myVar = 'hello';
dynamic myDynamicVar = 'hello';
myVar = 123; // not possible
myDynamicVar = 123; // possible
Jéwôm '
quelle
0

Dynamisch ist ein Datentyp, der alle Datentypen in Dart angibt

var ist eine Variablendeklarationsmethode wie "final", die den Datentyp ihres Werts annimmt

Josef Hescham
quelle
0

Wenn Sie var verwenden, können Sie den Datentyp der Variablen nicht ändern. Wenn Sie jedoch Dynamik verwenden, können Sie diese frei ändern. zum Beispiel.

dynamic x = 12; // type: integer
x= "Hello world"; // type: string

Dies funktioniert ohne Probleme, wenn Sie dasselbe mit var anstelle von dynamic tun. Es wird eine Fehlermeldung angezeigt, da Sie den Datentyp nicht ändern können, da er der Variablen bei der Initialisierung automatisch zugewiesen wird.

Yasser Ehab
quelle