98

この記事によると:

ご存知かもしれませんが、dynamic(現在は呼ばれているように)静的型アノテーションが提供されていない場合の代用型です。

dynamicでは、との違いは何varですか?いつ使用しますか?

4

12 に答える 12

112

dynamicすべての Dart オブジェクトの基礎となる型です。ほとんどの場合、明示的に使用する必要はありません。

varはキーワードであり、「ここに型が何であるかを記す必要はない」という意味です。Dart はvarキーワードをイニシャライザ タイプに置き換えるか、イニシャライザdynamicがない場合はデフォルトのままにします。

var有効期間中に変数の割り当てが変更されることが予想される場合に使用します。

var msg = "Hello world.";
msg = "Hello world again.";

final変数の割り当てが存続期間中同じままであると予想される場合に使用します。

final msg = "Hello world.";

(自由に) を使用finalすると、意図せずに変数の割り当てを誤って変更してしまった状況を把握するのに役立ちます。

オブジェクトに関しては 、finalとの間には細かい違いがあることに注意してください。必ずしもオブジェクト自体を不変にするわけではありませんが、次のことを行います。constfinalconst

// 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"];
于 2012-09-14T01:07:49.347 に答える
16

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
于 2012-09-14T04:13:37.647 に答える
6

以前の回答を見て、これがすべてを明確化/要約できることを願っています:

キーワード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 演算子を使用する方法と、 .runtimeTypewhich を使用する方法が異なります。次の例を参照してください。

    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
    
于 2021-04-30T19:11:58.960 に答える
0

dynamic は、dart のすべてのデータ型を示すデータ型です

var は、その値のデータ型を取る「final」のような変数宣言方法です

于 2020-08-15T12:47:02.467 に答える