Консолидированные ответы @Meyi и @ faisal-naseer и сравнение с небольшим программированием.
const:
ключевое слово const, используемое для создания переменной для хранения значения постоянной времени компиляции .Значение постоянной времени компиляции - это значение, которое будет постоянным при компиляции: -)
Например, 5
- постоянная времени компиляции.Пока DateTime.now()
, который не является постоянной времени компиляции.Потому что этот метод вернет время, когда строка выполняется во время выполнения.Поэтому мы не можем присвоить DateTime.now()
переменной const
.
const a = 5;
// Uncommenting below statement will cause compile time error.
// Because we can't able to assign a runtime value to a const variable
// const b = DateTime.now();
Должен быть инициализирован в той же строке .
const a = 5;
// Uncommenting below 2 statement will cause compilation error.
// Because const variable must be initialized at the same line.
// const b;
// b = 6;
ВсеПриведенные ниже утверждения являются приемлемыми.
// Without type or var
const a = 5;
// With a type
const int b = 5;
// With var
const var c = 6;
Переменная const уровня класса должна быть инициализирована, как показано ниже.
Class A {
static const a = 5;
}
Константа const уровня экземпляра невозможна.
Class A {
// Uncommenting below statement will give compilation error.
// Because const is not possible to be used with instance level
// variable.
// const a = 5;
}
Другое основное использование const
используется для того, чтобы сделать объект неизменным .Чтобы сделать объект класса неизменным, нам нужно использовать ключевое слово const с конструктором и сделать все поля окончательными , как указано ниже.
Class A {
final a, b;
const A(this.a, this.b);
}
void main () {
// There is no way to change a field of object once it's
// initialized.
const immutableObja = const A(5, 6);
// Uncommenting below statement will give compilation error.
// Because you are trying to reinitialize a const variable
// with other value
// immutableObja = const A(7, 9);
// But the below one is not the same. Because we are mentioning objA
// is a variable of a class A. Not const. So we can able to assign
// another object of class A to objA.
A objA = const A(8, 9);
// Below statement is acceptable.
objA = const A(10, 11);
}
, которые мы можем использовать постоянное ключевое слово для списка .
const a = const [] - переменная a
, инициализированная как const
, которая содержит список const
объектов (т. Е. Список должен содержать только постоянную времени компиляции инеизменяемые объекты).Поэтому мы не можем назначить a
с другим списком .
var a = const [] - переменная a
, инициализированная как var
, которая содержитсписок const
объектов .Таким образом, мы можем назначить другой список переменной a
.
Class A {
final a, b;
const A(this.a, this.b);
}
class B {
B(){ // Doing something }
}
void main() {
const constantListOfInt = const [5, 6, 7,
// Uncommenting below statement give compilation error.
// Because we are trying to add a runtime value
// to a constant list
// DateTime.now().millisecondsSinceEpoch
];
const constantListOfConstantObjA = const [
A(5, 6),
A(55, 88),
A(100, 9),
];
// Uncommenting below 2 statements will give compilation error.
// Because we are trying to reinitialize with a new list.
// constantListOfInt = [8, 9, 10];
// constantListOfConstantObjA = const[A(55, 77)];
// But the following lines are little different. Because we are just
// trying to assign a list of constant values to a variable. Which
// is acceptable
var variableWithConstantList = const [5, 6, 7];
variableWithConstantList = const [10, 11, 15];
var variableOfConstantListOfObjA = const [A(5, 8), A(7, 9), A(10, 4)];
variableWithConstantList = const [A(9, 10)];
}
final:
final ключевое слово, также используемое для преобразования переменной в содержит постоянное значение .После инициализации мы не можем изменить значение.
final a = 5;
// Uncommenting below statement will give compilation error.
// Because a is declared as final.
// a = 6;
Все операторы, упомянутые ниже, являются приемлемыми.
// Without type or var
final a = 5;
// With a type
final int b = 5;
// With var
final var c = 6;
Можно присвоить значение времени выполнения .
// DateTime.now() will return the time when the line is getting
// executed. Which is a runtime value.
final a = DateTime.now();
var b = 5;
final c = b;
Финальная переменная уровня класса должна быть инициализирована в той же строке.
Class A {
static final a = 5;
static final b = DateTime.now();
}
Финальная переменная уровня экземпляра должна быть инициализированав той же строке или в конструкторе инициализации.Значение будет занесено в память при создании объекта.
Class A {
final a = 5;
}
// Constructor with a parameter.
Class B {
final b;
B(this.b);
}
// Constructor with multiple parameter.
Class C {
final c;
C(this.c, int d) {
// Do something with d
}
}
void main() {
A objA = new A();
B objB = new B(5);
C objC = new C(5, 6);
}
Назначение списка .
final a = [5, 6, 7, 5.6, A()];
// Uncommenting Below statement will give compilation error.
// Because we are trying to reinitialize the object with another list.
// a = [9.9, 10, B()];