डार्ट में "कास्ट" और "अंतिम" कीवर्ड के बीच अंतर क्या है?


172

Dart में constऔर finalकीवर्ड में क्या अंतर है ?


1
इसके बारे में कुछ विवरण है const: stackoverflow.com/questions/51576209/… और अंतिम विस्फोट finalनिरंतर है (अंतिम कीवर्ड के साथ एक बार बनाया गया या असाइन नहीं किया जा सकता है) और आपको इसे एक बार इनिशियलाइज़ करना होगा।
ब्लास्कांक

जवाबों:


236

डार्ट की वेबसाइट पर एक पोस्ट है और यह इसे बहुत अच्छी तरह से समझाता है।

अंतिम:

"फाइनल" का अर्थ एकल असाइनमेंट है: एक अंतिम चर या क्षेत्र में एक इनिशलाइज़र होना चाहिए । एक बार एक मान निर्दिष्ट करने के बाद, एक अंतिम चर का मूल्य नहीं बदला जा सकता है। अंतिम चर को संशोधित करता है


कॉन्स्ट:

"const" का अर्थ है कि डार्ट में थोड़ा अधिक जटिल और सूक्ष्म। const मानों को संशोधित करता है । आप इसका उपयोग तब कर सकते हैं जब संग्रह बनाते हैं, जैसे const [1, 2, 3], और जब const (2 के रूप में) नए ऑब्जेक्ट्स का निर्माण करते हैं (2, 3)। यहां, कॉन्स्ट का मतलब है कि वस्तु की संपूर्ण गहरी स्थिति को पूरी तरह से संकलन के समय पर निर्धारित किया जा सकता है और यह कि ऑब्जेक्ट जमे हुए और पूरी तरह से अपरिवर्तनीय होगा।

कास्ट ऑब्जेक्ट्स में कुछ दिलचस्प गुण और प्रतिबंध हैं:

उन्हें उस डेटा से बनाया जाना चाहिए, जिसकी गणना संकलन समय पर की जा सकती है। एक कास्ट ऑब्जेक्ट में रनटाइम पर गणना करने के लिए आपके पास किसी भी चीज की पहुंच नहीं होती है। 1 + 2 एक वैध कास्ट एक्सप्रेशन है, लेकिन नया DateTime.now () नहीं है।

वे गहराई से, संक्रामक रूप से अपरिवर्तनीय हैं। यदि आपके पास एक अंतिम फ़ील्ड है जिसमें संग्रह है, तो वह संग्रह अभी भी परिवर्तनशील हो सकता है। यदि आपके पास एक कास्ट कलेक्शन है, तो उसमें सब कुछ भी कॉन्स्टेबल, रिकर्सिबल होना चाहिए।

वे विहित हैं । यह स्ट्रिंग इंटर्निंग की तरह है: किसी भी दिए गए कास्ट वैल्यू के लिए, एक सिंगल कास्ट ऑब्जेक्ट बनाया जाएगा और फिर से उपयोग नहीं किया जाएगा कि कितनी बार कॉन्स्टेंस एक्सप्रेशन का मूल्यांकन किया जाता है।


अच्छा तो इसका क्या मतलब है?

कॉन्स्ट:
यदि आपके पास मूल्य की गणना रनटाइम पर की जाती है ( new DateTime.now()उदाहरण के लिए), तो आप इसके लिए एक कास्ट का उपयोग नहीं कर सकते हैं । हालांकि, अगर मूल्य संकलन समय (कम से जाना जाता है const a = 1;), तो आप का उपयोग करना चाहिए constसे अधिक final। के बीच 2 अन्य बड़े अंतर हैं constऔर final। सबसे पहले, यदि आप उपयोग कर रहे हैं, तो आपको constइसे static constकेवल के बजाय घोषित करना होगा const। दूसरे, यदि आपके पास एक constसंग्रह है, तो उसके अंदर सब कुछ अंदर है const। यदि आपके पास एक finalसंग्रह है, तो उसके अंदर सब कुछ नहीं है final

अंतिम: यदि आप संकलन समय पर मूल्य नहीं जानते हैं, तो
finalइसका उपयोग किया जाना चाहिए const, और यह रनटाइम पर गणना / पकड़ा जाएगा। यदि आप एक HTTP प्रतिक्रिया चाहते हैं जिसे बदला नहीं जा सकता है, यदि आप डेटाबेस से कुछ प्राप्त करना चाहते हैं, या यदि आप किसी स्थानीय फ़ाइल से पढ़ना चाहते हैं, तो उपयोग करें final। कुछ भी जो संकलन समय पर ज्ञात नहीं है, finalखत्म हो जाना चाहिए const


इसके साथ ही जा रहा है की सभी ने कहा, दोनों constऔर finalपुन: असाइन नहीं किया जा सकता है, लेकिन एक में खेतों finalवस्तु, जब तक कि वे नहीं कर रहे हैं constया final, (विपरीत पुन: असाइन किया जा सकता है const)।


3
कॉन्स कीवर्ड का उपयोग संकलन-समय स्थिरांक का प्रतिनिधित्व करने के लिए किया जाता है। कांस्टेबल कीवर्ड का उपयोग करते हुए घोषित किए गए वेरिएबल्स अंतिम रूप से होते हैं।
अरुण जॉर्ज

1
@ मैय्या, हमें constकब और किसका उपयोग करना चाहिए final? क्या आप इन संशोधक के लिए किसी प्रकार का उपयोग-मामला जानते हैं?
CopsOnRoad

4
@CopsOnRoad आप इस वीडियो को डार्ट
कांस्ट

2
यह अंतिम वाक्य वास्तव में इसे अच्छी तरह से प्रस्तुत करता है। उसके लिए धन्यवाद।
यस्टर

क्या हमें यह भी ध्यान रखना चाहिए कि कॉन्स्ट एक विकल्प है? क्या प्रदर्शन लाभ वास्तव में बोधगम्य है?
कोडग्रू

63

कॉन्स्ट

मूल्य संकलन-समय पर ज्ञात होना चाहिए , const birthday = "2008/12/26"
प्रारंभ के बाद परिवर्तित नहीं किया जा सकता।


अंतिम

मूल्य रन-टाइम पर ज्ञात होना चाहिए , final birthday = getBirthDateFromDB()
प्रारंभ के बाद बदला नहीं जा सकता।


10
सबसे आसान और सबसे अच्छा स्पष्टीकरण।
अंकुर लहीरी

1
यह एक प्यार करता था :)
फैसल नसीर

43

समेकित @Meyi और @ faisal-naseer उत्तर और छोटी प्रोग्रामिंग के साथ तुलना।

स्थिरांक:

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;

क्लास लेवल कास्ट वैरिएबल को नीचे की तरह इनिशियलाइज़ किया जाना चाहिए।

Class A {
    static const a = 5;
}

इंस्टेंस लेवल कॉन्स्टेबल वेरिएबल संभव नहीं है

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 बनाने के लिए एक अन्य प्रमुख उपयोग किया जाता है । क्लास ऑब्जेक्ट को अपरिवर्तनीय बनाने के लिए हमें कंस्ट्रक्टर के साथ कॉन्स्टेबल कीवर्ड का उपयोग करना होगा और सभी फ़ील्ड्स को अंतिम रूप में नीचे बताए अनुसार बनाना होगा।

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

20

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

2
मुझे लगता है कि सवाल पूछने का एक बेहतर तरीका यह है कि संकलन समय संकलन पर रनटाइम आरंभीकरण को प्राथमिकता दी जाए ....
फैसल नसीर

और इसके लिए आप @Meyi उत्तर से परामर्श कर सकते हैं और लेख के लिंक को उसके पोस्ट से भी देख सकते हैं अपनी अद्भुत :)
फैसल नसीर

2

दोनों finalऔर constपुन: असाइन किए जाने से एक चर को रोकने के (कैसे करने के लिए इसी तरह के finalजावा में काम करता है या कैसे constजावास्क्रिप्ट में काम करता है)।

अंतर यह है कि मेमोरी कैसे आवंटित की जाती है। मेमोरी को finalरनटाइम पर एक constचर के लिए, और संकलन-समय पर एक चर के लिए आवंटित किया जाता है । finalक्योंकि कई कार्यक्रम चर किसी भी स्मृति की जरूरत नहीं होगी के बाद से कार्यक्रम तर्क उन्हें प्रारंभ करने के लिए फोन नहीं होगा संशोधक, अधिक सामान्यतः प्रयोग किया जाना चाहिए। एक constचर के साथ आप मूल रूप से कंप्यूटर को बता रहे हैं, "अरे, मुझे इस चर के लिए स्मृति की आवश्यकता है क्योंकि मैं जानता हूं कि मुझे इसकी आवश्यकता है।"

इस तरह से उनके बारे में सोचना उनके वाक्यात्मक उपयोग में अंतर को समझना आसान बनाता है। मुख्य रूप से एक finalचर एक उदाहरण चर हो सकता है, लेकिन एक वर्ग पर एक चर constहोना चाहिए static। ऐसा इसलिए है क्योंकि उदाहरण चर रनटाइम पर बनाए जाते हैं, और constचर - परिभाषा के अनुसार - नहीं हैं। इस प्रकार, constएक वर्ग पर चर होना चाहिए static, जिसका अर्थ है कि उस चर की एक प्रति एक वर्ग पर मौजूद है, चाहे वह वर्ग त्वरित हो।

यह वीडियो इसे काफी सरलता से तोड़ता है: https://www.youtube.com/watch?v=9ZZL3iyf4Vk

यह लेख अधिक गहराई में जाता है और दोनों के बीच एक बहुत ही महत्वपूर्ण अर्थ अंतर को बताता है, अर्थात finalचर को constसंशोधित करता है और मूल्यों को संशोधित करता है, जो अनिवार्य रूप से केवल उन constमूल्यों को शुरू करने में सक्षम होता है जो संकलन-समय पर व्युत्पन्न होते हैं।

https://news.dartlang.org/2012/06/const-static-final-oh-my.html


2

finalऔर constडार्ट में हम दोनों को एक समान मानने के स्तर तक भ्रमित कर रहे हैं।

आइए देखते हैं उनके अंतर:

पुनश्च मैं पाठ के बजाय छवि शामिल है क्योंकि मैं Stackoverflow .md प्रारूप में जानकारी आसानी से सारणीबद्ध नहीं कर सकता।


1

आप से आ रहे हैं C++तो constमें Dartहै constexprमें C++और finalमें Dartहै constमें C++

उपरोक्त केवल आदिम प्रकारों पर लागू होता है। हालांकि Dartचिह्नित वस्तुओं finalमें इसके सदस्यों के संदर्भ में परिवर्तनशील हैं।


2
की तरह। मुझे लगता है कि आप इसे आदिम प्रकारों के लिए कह सकते हैं लेकिन वस्तुओं के लिए नहीं। constC ++ में लगभग हमेशा यह निर्दिष्ट करने के लिए उपयोग किया जाता है कि कोई वस्तु किसी विशिष्ट संदर्भ या सूचक के माध्यम से उत्परिवर्तित नहीं होती है। finalDart उस चर के माध्यम से उत्परिवर्तित होने से ऑब्जेक्ट को रोकता नहीं है।
jamesdlin

0

आप एक constका उपयोग कर प्रारंभ नहीं कर सकते final। उदाहरण के लिए :

  final myConst = 1;
  const myFinal = 2;

  final a = myConst; // possible
  final b = myFinal; // possible
  const c = myConst; // this is not possible
  const d = myFinal; // possible

0

किस कीवर्ड का उपयोग कब करें?

दोनों के लिए एक सरल उदाहरण: फाइनल का उपयोग करें: यदि आप नहीं जानते कि इसका मूल्य संकलन-समय पर क्या होगा। उदाहरण के लिए, जब आपको एपीआई से डेटा प्राप्त करने की आवश्यकता हो सकती है, तो यह आपके कोड को चलाते समय होता है।

Const का उपयोग करें: यदि आप सुनिश्चित हैं कि आपके कोड को चलाते समय कोई मान नहीं बदला जाएगा। उदाहरण के लिए, जब आप एक वाक्य की घोषणा करते हैं जो हमेशा एक ही रहता है।

https://itnext.io/difference-between-const-and-final-in-dart-78c129d0c573

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.