Junior
Dartта final жана const ачкыч сөздөрүнүн айырмасы эмнеде?
sobes.tech AI
AIден жооп
final жана const өзгөрмөлөрдү түзүү үчүн колдонулат, алардын маанилери аныкталгандан кийин өзгөрүлбөйт:
Негизги айырмачылыктар:
-
Баштоо убактысы:
finalишке ашырылуу учурунда (runtime) биринчи кайрылуудан кийин аныкталат.constкомпиляция учурунда (compile-time) аныкталат.
-
Маанилердин түрү:
finalөзгөрмө ишке ашырылуу учурунда эсептелген маанини сактай алат.constөзгөрмө эсептелген маанини сакташы керек, ал компиляция учурунда белгилүү болушу керек (литералдар, константтуу өрнөктөрдүн жыйынтыгы).
-
Константтыктык:
final: Өзгөрмө константтуу, бирок ага шилтеме берген мааниси (эгер бул объект болсо) өзгөрүлмө болушу мүмкүн.const: Өзгөрмө константтуу, жана ага шилтеме берген мааниси да константтуу (өзгөрүлбөс) болушу керек.
Мисалдар:
// final - ишке ашырылуу учурунда аныкталат
final DateTime now = DateTime.now(); // Маани only runtimeда белгилүү
// const - компиляция учурунда аныкталат
const double pi = 3.14; // Маани компиляция этабында белгилүү
// const колдонуу тизмелер жана карталар үчүн алардын өзгөрүлбөс болушун камсыздайт
const List<int> constantList = [1, 2, 3];
// constantList[0] = 10; // Ката! Тизмелер өзгөрүлбөс
// final колдонуу тизмелер жана карталар үчүн өзгөрүлмө кылат,
// бирок объекттин мазмуну өзгөрүшү мүмкүн (эгер объект өзгөрүлмө болсо)
final List<int> finalList = [1, 2, 3];
finalList[0] = 10; // уруксат берилген, себеби List өзгөрүлмө
// final менен константтуу мааниси
final int a = 5; // мүмкүн, бирок `const` көбүрөөк ылайыктуу
| Баштоо убактысы | Маанилердин талаптары | Объекттин өзгөрүлмө болушу (эгер объектке шилтеме жасаса) | |
|---|---|---|---|
final |
Ишке ашырылуу учурунда | Мүмкүн болсо ишке ашырылуу учурунда эсептелет | Өзгөрүлмө болушу мүмкүн, эгер объект өзгөрүлмө болсо |
const |
Компиляция учурунда | Мүмкүн эмес, белгилүү болушу керек | Өзгөрбөс болушу керек |