В чем разница между ключевыми словами '' const '' и '' final '' в Dart? - PullRequest
0 голосов
/ 20 мая 2018

В чем разница между ключевыми словами const и final в Dart?

Ответы [ 5 ]

0 голосов
/ 05 мая 2019

Const

Значение должно быть известно в время компиляции , const birth = "2008/12/26".Не может быть изменено после инициализации


Финал

Значение должно быть известно в время выполнения ,final birth = getBirthFromDB().Не может быть изменено после инициализации

0 голосов
/ 02 января 2019

Консолидированные ответы @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()];
0 голосов
/ 20 июля 2018

Расширение ответа с помощью @ Meyi

  • конечная переменная может быть установлена ​​только один раз и инициализируется при обращении к ней (например, из раздела кода ниже, если вы используете значение biggestNumberOndice только тогдазначение будет инициализировано и память будет назначена).
  • 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;
}
0 голосов
/ 14 августа 2018

Если вы приехали из C++, то const в Dart будет constexpr в C++, а final в Dart будет const в C++.

Вышесказанное относится только к примитивным типам.Однако в Dart объекты, отмеченные final, являются изменяемыми с точки зрения его членов.

0 голосов
/ 20 мая 2018

На сайте дартса есть пост, и он довольно хорошо его объясняет.

Финал:

«финал» означаетодиночное присваивание: конечная переменная или поле должны иметь инициализатор.После присвоения значения окончательное значение переменной не может быть изменено.final изменяет переменные .


Const:

"const" имеет значение, которое немного сложнееи тонкий в дартс.const изменяет значения .Вы можете использовать его при создании коллекций, таких как const [1, 2, 3], и при создании объектов (вместо новых), таких как const Point (2, 3).Здесь const означает, что все глубокое состояние объекта может быть полностью определено во время компиляции и что объект будет заморожен и полностью неизменен.

У объектов Const есть пара интересных свойств и ограничений:

Они должны быть созданы из данных, которые могут быть рассчитаны во время компиляции.Константный объект не имеет доступа ни к чему, что вам нужно будет вычислить во время выполнения.1 + 2 является допустимым константным выражением, а новый DateTime.now () - нет.

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

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


Итак, что это значит?

Const:
Если значение является вашим значением, которое вычисляется во время выполнения (например, new DateTime.now()), вы можете не используйте const для этого.Однако, если это значение известно во время компиляции (const a = 1;), вам следует использовать const вместо final.Есть еще 2 больших различия между const и final.Во-первых, если вы используете const, вы должны объявить его как static const, а не просто const.Во-вторых, если у вас есть коллекция const, все внутри нее находится в const.Если у вас есть коллекция final, все внутри нее не final.

Final:
final следует использовать поверх const, если вы не знаете значение во время компиляции, и оно будет вычислено / получено во время выполнения.Если вам нужен HTTP-ответ, который нельзя изменить, если вы хотите получить что-то из базы данных или если вы хотите читать из локального файла, используйте final.Все, что не известно во время компиляции, должно быть final сверх const.


С учетом всего сказанного, const и final не могут быть переназначены, но поля вfinal объект, если он не const или final, может быть переназначен (в отличие от const).

...