В чем разница между использованием const в качестве ссылки и значения?

Я имею в виду, в чем разница между " const list =[1,2,3]" и "var list= const[1,2,3]"

1
0
76
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Разница заключается в неизменности и способе объявления списка.

const list = [1, 2, 3] объявляет список констант, который является константой времени компиляции, то есть его значение определяется во время компиляции и не может быть изменено во время выполнения.

var list = const[1, 2, 3] объявляет переменную, содержащую постоянный список, но значение этой переменной можно изменить на другой список позже в вашем коде.

void main() {
  const list1 =[1,2,3];
  var list2 = const[1,2,3];
  
  list1.add(4); // <--error
  list2.add(4); // <--error
  list1 = [5]; // <--error
  list2 = [5];
  list2.add(6);
  print(list2);
} 
Ответ принят как подходящий

Основное отличие — неизменяемость.

const list =[1,2,3] Это создание постоянного списка, где список является изменяемым. Таким образом, вы можете изменить его элемент, но не можете изменить ссылку на список.

var list= const[1,2,3] В этом случае мы создаем список переменных, значение которых является постоянным. В этом случае и список, и ссылка являются неизменяемыми. Поэтому мы не можем ни изменить элемент списка, ни назначить список различий.

const list1 = [1, 2, 3];
var list2 = const [1, 2, 3];

list1[0] = 5; // This is allowed
list2[0] = 5; // This give you compilation error

попробуйте запустить свой код, потому что он даст неожиданные результаты (затем проведите рефакторинг вашего ответа), ваш вклад оценен по достоинству.

A-E 29.04.2024 10:52

Это неправильно и не должно быть принятым ответом. В обоих случаях будет создан неизменяемый объект List. Единственное отличие состоит в том, что вторая версия позволяет переназначать переменную.

jamesdlin 29.04.2024 11:07

Этот ответ глубоко исследует эту проблему:

каждое значение, хранящееся в памяти, должно иметь ссылку, указывающую на его местоположение в этой памяти.

var list = [1,2,3];

list : ссылочная переменная, указывающая на массив целых чисел, равный [1,2,3], хранящийся в памяти.

Теперь перейдем к проблеме:

  • поставив const перед значением:

var list= const [1,2,3]

Значение, хранящееся в памяти [1,2,3], помечается как const, где const означает: этот объект полностью постоянен (постоянная времени компиляции), фактически этот объект и его дочерние элементы, если таковые имеются.

но ссылочная переменная все еще не постоянна, она изменяема (может быть изменена, чтобы указывать на любые другие значения того же типа):

list[0] = 10; // fail, because it points to a constant value
list = [5,6]; // pass (just point to another value)
list = [4]; // pass

У вас есть только свободная ссылочная переменная, но постоянного значения.

  • Использование const для объявления ссылочной переменной:

const list = [1,2,3];

объявление этой ссылочной переменной как const приводит к следующему:

  1. ссылочная переменная полностью неизменяема
  2. значение, на которое указывает эта ссылка, также полностью неизменный.

что означает, что любые изменения запрещены:

list[0] = 5; // fails

list = [2,5] // fails 

У вас есть полностью неизменяемый термин как для переменной, так и для значения (значение не может быть изменено, а переменная не может ссылаться на другое значение).

Надеюсь, это вам поможет.

Другие вопросы по теме