Sie scheinen beide in identischen Fällen verwendet zu werden. Gibt es eine andere Darstellung oder andere Feinheiten bei der Typprüfung usw.?
Der Abschnitt Typ dynamisch aus der Dart-Programmierung Sprachspezifikation, 3. Ausgabe :
Typ dynamic hat Methoden für jede mögliche Bezeichner und Arity, mit jede mögliche Kombination von benannten Parametern. Diese Methoden haben alle eine Dynamik als ihre Rückgabetyp und ihre formalen Parameter haben alle Typ dynamisch. Der Typ dynamic hat Eigenschaften für jeden möglichen Bezeichner. Diese Eigenschaften alle habe type dynamisch.
Das bedeutet, dass Sie keine Warnungen erhalten, wenn Sie eine Methode für eine dynamic
typisierte Variable aufrufen. Bei einer Variablen wie Object
ist dies nicht der Fall. Zum Beispiel:
Zur Laufzeit denke ich, Sie sollten keinen Unterschied sehen.
Eine andere Perspektive auf dynamic
ist, dass es nicht wirklich ein Typ ist - es ist eine Möglichkeit, die Typprüfung zu deaktivieren und dem statischen System zu sagen: "Vertraue mir, ich weiß, was ich tue". Das Schreiben von var o;
deklariert eine Variable, die nicht typisiert ist - sie wird stattdessen als "nicht typgeprüft" markiert.
Wenn Sie Object o = something;
schreiben, sagen Sie dem System, dass es nichts von o
annehmen kann, außer dass es ein Object
ist. Sie können toString
und hashCode
aufrufen, weil diese Methoden auf Object
definiert sind, aber wenn Sie versuchen, o.foo()
auszuführen, erhalten Sie eine Warnung - sie können nicht sehen, dass Sie das tun können, und warnt Sie Sie, dass Ihr Code wahrscheinlich falsch ist.
Wenn Sie var o = something
schreiben, sagen Sie dem System, nichts anzunehmen und nichts zu überprüfen. Wenn Sie o.foo()
schreiben, wird Sie nicht gewarnt. Du hast gesagt, dass "alles, was mit o
zusammenhängt, in Ordnung ist! Vertraue mir, ich weiß, was ich tue" und denkt daher, dass o.foo()
in Ordnung ist.
Mit großer Macht kommt große Verantwortung - wenn Sie die Typprüfung für eine Variable deaktivieren, greift sie auf Sie zurück, um sicherzustellen, dass Sie nichts falsch machen.
Um Alexandres Antwort auf den praktischen Unterschied hinzuzufügen, gibt es auch einen semantischen Unterschied zwischen den beiden, und die Verwendung des richtigen wird dazu beitragen, Ihre Absicht anderen Programmierern besser zu vermitteln.
Wenn Sie Object
verwenden, sagen Sie, dass Sie den Typ kennen, mit dem Sie arbeiten, und es ist Object
. Zum Beispiel:
Da hashCode
eine Eigenschaft auf Object
ist, verwenden wir Object
als Parametertyp, um anzugeben, dass die Funktion alles vom Typ Object
akzeptieren kann.
Andererseits bedeutet die Verwendung von dynamic
, dass das Dart-System den Typ, den Sie verwenden möchten, nicht richtig ausdrücken kann:
Da Dart derzeit keine Unionstypen unterstützt, gibt es keine Möglichkeit, den Typ Email | String
auszudrücken. Daher müssen wir dynamic
verwenden, um alle Typen zu akzeptieren, und nur die Fälle behandeln, in denen der Typ uns interessiert in.
Tags und Links dart