в чем разница между ключевым словом "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;
}

если вы идете от C++ затем const на Dart и constexpr на C++ и final на Dart и const на C++.