Was ist der Unterschied zwischen Dynamic und Object in Dart?

8

Sie scheinen beide in identischen Fällen verwendet zu werden. Gibt es eine andere Darstellung oder andere Feinheiten bei der Typprüfung usw.?

    
user3761898 07.07.2015, 00:10
quelle

3 Antworten

5

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:

%Vor%

Zur Laufzeit denke ich, Sie sollten keinen Unterschied sehen.

    
Alexandre Ardhuin 07.07.2015, 09:37
quelle
3

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.

    
lrn 08.07.2015 14:35
quelle
2

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:

%Vor%

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:

%Vor%

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.

    
Pixel Elephant 07.07.2015 20:04
quelle

Tags und Links