в чем разница между ключевым словом "const" и "final" в Dart?
в чем разница между const
и final
ключевые слова на языке Dart?
Это действительно сбивает с толку меня.
3 ответов
Я нашел этот пост на веб-сайте dart, и это объясняет это довольно хорошо.
https://news.dartlang.org/2012/06/const-static-final-oh-my.html
финал:
"final" означает одно назначение: конечная переменная или поле должны иметь инициализатор. После присвоения значения значение конечной переменной не может быть изменено. окончательный изменяет переменные.
Const:
"const" имеет значение, которое немного сложнее и тоньше в Dart. const изменяет значения. Вы можете использовать его при создании коллекций, таких как const [1, 2, 3], и при создании объектов (вместо новых), таких как const Point(2, 3). Здесь const означает, что все глубокое состояние объекта может быть полностью определено во время компиляции и что объект будет заморожен и полностью неизменен.
объекты Const имеют несколько интересных свойств и ограничения:
Они должны быть созданы из данных, которые могут быть вычислены во время компиляции. Объект const не имеет доступа ни к чему вы должны вычислить во время выполнения. 1 + 2-допустимое выражение const, но новое DateTime.теперь () нет.
Они глубоко, транзитивно неизменными. Если у вас есть последнее поле, содержащее коллекцию, эта коллекция все еще может быть изменяемой. Если у вас есть коллекция const, все в ней также должно быть const, рекурсивно.
Они канон. Это похоже на интернирование строк: для любого заданного значения const будет создан и повторно использован один объект const независимо от того, сколько раз оценивается выражение(ы) const. Другими словами:
расширение ответа @Meyi
- конечная переменная может быть установлена только один раз, и она инициализируется, когда
доступный.(например, из раздела кода ниже, если вы используете значение
biggestNumberOndice
только тогда значение будет инициализировано и память будет назначена). const является внутренне окончательным по своей природе, но основное различие заключается в том, что его константа времени компиляции, которая инициализируется во время компиляции даже если вы не используете его значение, он будет инициализирован и будет принимать места в памяти.
переменная из классов может быть окончательной, но не постоянной, и если вы хотите константа на уровне класса делает его статическим const.
код:
void main() {
// final demonstration
final biggestNumberOndice = '6';
// biggestNumberOndice = '8'; // Throws an error for reinitialization
// const
const smallestNumberOnDice = 1;
}
class TestClass {
final biggestNumberOndice = '6';
//const smallestNumberOnDice = 1; //Throws an error
//Error . only static fields can be declared as constants.
static const smallestNumberOnDice = 1;
}