Разница между "var" и "динамическим" типом в Dart?

Согласно этой статье:

Как вы, возможно, знаете, dynamic (как он теперь называется) является типом stand-in, когда аннотация статического типа не предоставляется.

Итак, какова разница между dynamic и var? Когда использовать?

Ответ 1

динамический - это тип, лежащий в основе всех объектов Dart. Вам не нужно явно использовать его в большинстве случаев.

var - это ключевое слово, означающее: "Мне все равно, чтобы указать, какой тип здесь". Dart заменит ключевое слово var типом инициализатора или оставит его динамическим по умолчанию, если инициализатор отсутствует.

Используйте 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"];

Ответ 2

попробуйте это в DartPad:

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

вы можете изменить тип х, но не а.

Ответ 3

var, как и final, используется для объявления переменной. Это совсем не тип.

Дарт достаточно умен, чтобы знать точный тип в большинстве ситуаций. Например, следующие два утверждения эквивалентны:

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

Ответ 4

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.

Ответ 5

Одним из аспектов, который может быть рассмотрен в сравнении с динамическим vs, является учет поведения при использовании объявления var с инициализацией, при этом нет возможности изменить тип, который в случае динамического есть.

Но динамический vs var - это не тот вопрос, который я хотел бы задать. Я хотел бы спросить больше, в чем разница между динамическим и объектным.

Вот аннотация DO с Object вместо динамической, чтобы указать, что любой объект разрешен.

С самого начала это трудно почувствовать, но я бы отнесся к динамическому аргументу общего типа.