solo significa reservada que palabras palabra modificador lenguaje lectura codigos claves dart const keyword final

significa - ¿Cuál es la diferencia entre la palabra clave '''' const '''' y '''' final '''' en Dart?



readonly c# (5)

¿Cuál es la diferencia entre const y final palabra clave final en Dart?


Const

El valor debe ser conocido en tiempo de compilación , const birth = "2008/12/26" . No se puede cambiar después de inicializar

Final

El valor debe ser conocido en tiempo de ejecución , final birth = getBirthFromDB() . No se puede cambiar después de inicializar


Extendiendo la respuesta por @Meyi

  • la variable final solo se puede configurar una vez y se inicializa cuando se accede a ella (por ejemplo, en la sección de código a continuación, si usa el valor de biggestNumberOndice solamente, el valor se inicializará y la memoria se asignará).
  • const es de naturaleza final interna, pero la principal diferencia es que su constante de tiempo de compilación que se inicializa durante la compilación, incluso si no usa su valor, se inicializará y ocupará espacio en la memoria.

  • La variable de las clases puede ser final pero no constante y si desea una constante a nivel de clase, haga que sea constante.

Código:

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; }


Respuestas consolidadas de @Meyi y @ faisal-naseer y comparación con poca programación.

const

La palabra clave const se usa para hacer una variable para almacenar un valor constante de tiempo de compilación . El valor de constante de tiempo de compilación es un valor que será constante al compilar :-)

Por ejemplo 5 es una constante de tiempo de compilación. Mientras que DateTime.now() no es una constante de tiempo de compilación. Debido a que este método devolverá el tiempo en que la línea se ejecuta en tiempo de ejecución. Así que no podemos asignar el DateTime.now() a una variable 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();

Se debe inicializar en la misma línea .

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;

Todas las declaraciones mencionadas a continuación son aceptables.

// Without type or var const a = 5; // With a type const int b = 5; // With var const var c = 6;

La variable constante de nivel de clase debe inicializarse como se muestra abajo.

Class A { static const a = 5; }

La variable const de nivel de instancia no es posible .

Class A { // Uncommenting below statement will give compilation error. // Because const is not possible to be used with instance level // variable. // const a = 5; }

El otro uso importante de const se utiliza para hacer el objeto inmutable . Para hacer que un objeto de clase sea inmutable, necesitamos usar la palabra clave const con el constructor y hacer que todos los campos sean finales como se menciona a continuación.

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); }

Podemos usar la palabra clave const en una lista .

const a = const [] - Una variable a inicializada como const que contiene una lista de objetos const (es decir, La lista debe contener solo objetos de constante de tiempo de compilación e inmutables). Así que no podemos asignar a con otra lista .

var a = const [] - Una variable a inicializada como var que contiene una lista de objetos const . Entonces podemos asignar otra lista a la variable 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:

La palabra clave final también se utiliza para hacer que la variable mantenga un valor constante . Una vez inicializado no podemos cambiar el valor.

final a = 5; // Uncommenting below statement will give compilation error. // Because a is declared as final. // a = 6;

Todas las declaraciones mencionadas a continuación son aceptables.

// Without type or var final a = 5; // With a type final int b = 5; // With var final var c = 6;

Puede asignar un valor de tiempo de ejecución .

// 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;

La variable final de nivel de clase debe inicializarse en la misma línea.

Class A { static final a = 5; static final b = DateTime.now(); }

La variable final de nivel de instancia debe inicializarse en la misma línea o en la inicialización del constructor. El valor se pondrá en la memoria cuando se crea el objeto.

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); }

Asignando una lista .

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()];


Si viene de C++ , const en Dart es constexpr en C++ y final en Dart es const en C++ .

Lo anterior se aplica sólo a los tipos primitivos. Sin embargo, en Dart objetos marcados como final son mutables en términos de sus miembros.


Hay un post en el sitio web de dart y lo explica bastante bien.

Final:

"final" significa asignación única: una variable o campo final debe tener un inicializador. Una vez asignado un valor, el valor de una variable final no se puede cambiar. Final modifica las variables .

Const

"const" tiene un significado que es un poco más complejo y sutil en Dart. const modifica los valores . Puede usarlo al crear colecciones, como const [1, 2, 3], y al construir objetos (en lugar de nuevos) como const Point (2, 3). Aquí, const significa que todo el estado profundo del objeto se puede determinar completamente en el momento de la compilación y que el objeto se congelará y será completamente inmutable.

Los objetos const tienen un par de propiedades y restricciones interesantes:

Deben crearse a partir de datos que se pueden calcular en tiempo de compilación. Un objeto const no tiene acceso a nada de lo que necesitaría calcular en tiempo de ejecución. 1 + 2 es una expresión de const válida, pero el nuevo DateTime.now () no lo es.

Son profundamente, transitoriamente inmutables. Si tiene un campo final que contiene una colección, esa colección aún puede ser mutable. Si tiene una colección de const, todo lo que contiene debe ser const, recursivamente.

Están canonicalizados . Esto es algo así como una cadena interna: para cualquier valor constante de const, un único objeto const se creará y reutilizará sin importar cuántas veces se evalúen las expresiones const.

¿Entonces, qué significa esto?

Const
Si el valor es el valor que tiene se calcula en tiempo de ejecución (por ejemplo, el new DateTime.now() ), no puede usar una constante para ello. Sin embargo, si el valor se conoce en tiempo de compilación ( const a = 1; ), debe usar const sobre final . Hay otras 2 grandes diferencias entre const y final . En primer lugar, si está utilizando const , debe declararlo como static const lugar de const . En segundo lugar, si tienes una colección de const , todo dentro de eso está en const . Si tienes una colección final , todo lo que contiene no es final .

Final:
final debe utilizarse sobre const si no conoce el valor en el momento de la compilación, y se calculará / capturará en tiempo de ejecución. Si desea una respuesta HTTP que no se puede cambiar, si desea obtener algo de una base de datos o si desea leer un archivo local, use final . Cualquier cosa que no se sepa en el momento de la compilación debe ser final sobre const .

Con todo lo que se dice, tanto la const como la final no se pueden reasignar, pero los campos en un objeto final , siempre que no sean const o final , se pueden reasignar (a diferencia de la const ).