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 dynamic
und var
? Wann verwenden?
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 dynamic
und var
? Wann verwenden?
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"];
var
nicht initialisiert ist, es zu sein scheintdynamic
(Sie können zBvar foo; foo = "str; foo = 1;
(oder vom Typ Objekt?), Dies wäre eine Klärung wert.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.
quelle
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.
quelle
var
Wiefinal
wird 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
dynamic
handelt 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 indynamic
umwandeln, 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
quelle
var a
Erstellt eine Variable vom Typ Dynamisch.String a
Erstellt 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.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.
quelle
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 deklarierenvar
, 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
dynamic
Sie diese Option, wenn Sie eine nicht typisierte Variable möchten. Verwenden Sie diese Option,var
wenn Sie eine typisierte Variable mit einem beliebigen Typ möchten, den Sie ihr zuweisen.quelle
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.
quelle
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); }
quelle
Eine
dynamic
Variable kann ihren Typ ändern und einvar
Typ kann nicht geändert werden.Zum Beispiel :
var myVar = 'hello'; dynamic myDynamicVar = 'hello'; myVar = 123; // not possible myDynamicVar = 123; // possible
quelle
Dynamisch ist ein Datentyp, der alle Datentypen in Dart angibt
var ist eine Variablendeklarationsmethode wie "final", die den Datentyp ihres Werts annimmt
quelle
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.
quelle