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?
Antworten:
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 scheint dynamic
(Sie können zB var 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.
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.
var
Wie final
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 in dynamic
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
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.
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 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.
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.
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);
}
Dynamisch ist ein Datentyp, der alle Datentypen in Dart angibt
var ist eine Variablendeklarationsmethode wie "final", die den Datentyp ihres Werts annimmt
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.