web-dev-qa-db-ja.com

Dartの「var」タイプと「dynamic」タイプの違いは何ですか?

この記事 によると:

ご存知かもしれませんが、dynamic(現在は呼び出されています)は、静的型注釈が提供されていない場合の代替型です。

では、dynamicvarの違いは何ですか?いつ使用するのですか?

48
Gero

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

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

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

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

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

final msg = "Hello world.";

final(寛大に)を使用すると、意図していないときに誤って変数の割り当てを変更した状況を見つけるのに役立ちます。

オブジェクトに関しては、finalconstの間には細かい違いがあることに注意してください。 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"];
35
John Evans

DartPad でこれを試してください:

void main() {
  dynamic x = 'hal';
  x = 123;
  print(x);
  var a = 'hal';
  a = 123;
  print(a);
}

xのタイプは変更できますが、aは変更できません。

16
rough

varは、finalと同様に、変数を宣言するために使用されます。 notなんらかの型です。

Dart Editorは、状況によっては正確なタイプを知るのに十分スマートです。たとえば、次の2つのステートメントは、設定で「型チェックに推定型情報を使用する」をオンにした場合、エディターで類似しています。

var a = "abc";    // type of variable is dynamic,
                  // but editor can infer it is a string
String a = "abc"; // type of variable is String

一方、dynamicは、任意の型(別名クラス)であることを示す特殊な型です。たとえば、オブジェクトをdynamicにキャストすることにより、任意のメソッドを呼び出すことができます(メソッドがあると想定)。

(foo as dynamic).whatever(); //valid. compiler won't check if whatever() exists
(foo as var).whatever(); //illegal. var is not a type
7
Tom Yeh
var a ;
a = 123;
print(a is int);
print(a);
a = 'hal';
print(a is String);

初期値なしで定義された場合、varは動的です

var b = 321;
print(b is int);
print(b);
//b = 'hal'; //error
print(b is String);

この場合、初期値で定義すると、varはintになります。

2
John Wang

比較で考慮できる側面の1つdynamic vs varは、初期化と一緒にvar宣言を使用するときに動作を考慮していると同時に変更する可能性がないダイナミックの場合のタイプです。

しかし、動的vs変数は私が何を質問するかという問題ではありません。 動的vsオブジェクトの違いは何ですか?.

DOは、動的ではなくObjectで注釈を付けて、任意のオブジェクトが許可されていることを示しています。

最初はそれを感じるのは難しいですが、動的なジェネリック型の引数に関連します。

0
MagGGG