この記事によると:
ご存知かもしれませんが、
dynamic
(現在は呼ばれているように)静的型アノテーションが提供されていない場合の代用型です。
dynamic
では、との違いは何var
ですか?いつ使用しますか?
dynamic
すべての Dart オブジェクトの基礎となる型です。ほとんどの場合、明示的に使用する必要はありません。
var
はキーワードであり、「ここに型が何であるかを記す必要はない」という意味です。Dart はvar
キーワードをイニシャライザ タイプに置き換えるか、イニシャライザdynamic
がない場合はデフォルトのままにします。
var
有効期間中に変数の割り当てが変更されることが予想される場合に使用します。
var msg = "Hello world.";
msg = "Hello world again.";
final
変数の割り当てが存続期間中同じままであると予想される場合に使用します。
final msg = "Hello world.";
(自由に) を使用final
すると、意図せずに変数の割り当てを誤って変更してしまった状況を把握するのに役立ちます。
オブジェクトに関しては 、final
との間には細かい違いがあることに注意してください。必ずしもオブジェクト自体を不変にするわけではありませんが、次のことを行います。const
final
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
、のようfinal
に、変数を宣言するために使用されます。全然タイプじゃない。
Dart は、ほとんどの状況で正確なタイプを認識できるほどスマートです。たとえば、次の 2 つのステートメントは同等です。
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
一方、dynamic
は任意の型 (別名クラス) になることができることを示す特別な型です。たとえば、オブジェクトを にキャストするとdynamic
、任意のメソッドを呼び出すことができます (メソッドがあると仮定します)。
(foo as dynamic).whatever(); //valid. compiler won't check if whatever() exists
(foo as var).whatever(); //illegal. var is not a type
以前の回答を見て、これがすべてを明確化/要約できることを願っています:
キーワードvar、final、および constがあります。これらは変数を宣言することです(その存在を示すため)(サイドノート:宣言と初期化)
次に、String、int、List、dynamic などの型があります (型は、変数が保持する値の種類を示します。これは、型の安全のためです) 。
通常、型を明示して変数を宣言します。
String a; // a is now a String type
int b; // b is now an int type
しかし、var キーワードを使用することもできます。デフォルトでは、これにより変数の型が初期化されたものに設定されます。(これを型推論と呼びます)
var a = "hello"; // a is now a String type
var b = 5; // b is now an int type
var キーワードで変数を宣言しようとして、値を初期化しないとどうなるでしょうか? どのように型を推論することになっていますか? さて、ダイナミックというタイプもあります。これは、変数に任意の型の値を割り当てることができるという意味で、通常の String や int とは異なります (通常はエラーが発生します)。
String a = "hello"; // a is now a String type
// var a = "hello"; // Alternative way; same as the line above because its type is inferred to be String
a = 5 // error: A value of type 'int' can't be assigned to a variable of type 'String'
dynamic b; // b is now a dynamic type
b = "hello"; // still a dynamic type, but now its value is of type String (You can use b.runtimeType to check)
b = 5; // dynamic type, but now its value is of type int
したがって、記事からの引用に関する元の混乱に対処するために、
ご存知かもしれませんが、動的 (現在はそう呼ばれています) は、静的型注釈が提供されていない場合の代用型です。
これは、その型を明示的に宣言せず (var を使用して変数を宣言する)、初期化せずに宣言した場合、その型を動的であると推論するだけであることを意味します。
var b; // b is now a dynamic type, the following will not have any errors.
b = "hello";
b = 5;
b = true;
その他の注意事項:
final と const について人々が話し始めた理由はわかりませんが、詳細を知りたい場合は、ここで受け入れられた回答がよく説明されていると思います。
dynamic a;
どちらも動的型の変数をvar a;
宣言します。
変数の型をチェックする 2 つの方法は、 is 演算子を使用する方法と、 .runtimeType
which を使用する方法が異なります。次の例を参照してください。
dynamic b; // b is now a dynamic type, no value
print(b is dynamic); // true
print(b is Null); // true
print(b is String); // false
print(b is int); // false
print(b.runtimeType); // Null
b = "hello"; // dynamic type, String value
print(b is dynamic); // true
print(b is Null); // false
print(b is String); // true
print(b is int); // false
print(b.runtimeType); // String
b = 5; // dynamic type, int value
print(b is dynamic); // true
print(b is Null); // false
print(b is String); // false
print(b is int); // true
print(b.runtimeType); // int
dynamic は、dart のすべてのデータ型を示すデータ型です
var は、その値のデータ型を取る「final」のような変数宣言方法です