ডার্টে "কনস্ট" এবং "চূড়ান্ত" কীওয়ার্ডগুলির মধ্যে পার্থক্য কী?


172

মধ্যে পার্থক্য কি constএবং finalডার্ট মধ্যে শব্দ?


1
এখানে কিছু বিস্তারিত হয় const: stackoverflow.com/questions/51576209/... এবং সহজ explonation finalধ্রুবক (পুনঃস্থির বা ধার্য করতে একবার চূড়ান্ত শব্দ দিয়ে তৈরি করতে পারেন) এবং আপনি একবার এটি আরম্ভ করতে হবে।
ব্লাসানকা

উত্তর:


236

ডার্টের ওয়েবসাইটে একটি পোস্ট রয়েছে এবং এটি এটি বেশ ভালভাবে ব্যাখ্যা করেছে।

ফাইনাল:

"চূড়ান্ত" অর্থ সিঙ্গল-অ্যাসাইনমেন্ট: একটি চূড়ান্ত ভেরিয়েবল বা ক্ষেত্রের অবশ্যই একটি ইনিশিয়ালাইজার থাকতে হবে। একবার কোনও মূল্য নির্ধারিত হয়ে গেলে, একটি চূড়ান্ত ভেরিয়েবলের মান পরিবর্তন করা যায় না। চূড়ান্ত পরিবর্তনশীল পরিবর্তন করে


const:

"কনস্ট" এর একটি অর্থ রয়েছে যা ডার্টে কিছুটা জটিল এবং সূক্ষ্ম। কনস্ট মান পরিবর্তন করে । কনস্ট [1, 2, 3] এর মতো সংগ্রহ তৈরি করার সময় এবং কনস্ট পয়েন্ট (2, 3) এর মতো (নতুন পরিবর্তে) অবজেক্ট তৈরি করার সময় আপনি এটি ব্যবহার করতে পারেন। এখানে, কনস্টের অর্থ হ'ল কম্পাইল করার সময় অবজেক্টের সম্পূর্ণ গভীর অবস্থা সম্পূর্ণ নির্ধারণ করা যেতে পারে এবং অবজেক্টটি হিমশীতল এবং সম্পূর্ণরূপে অপরিবর্তনীয়।

কনস্ট অবজেক্টগুলির কয়েকটি আকর্ষণীয় বৈশিষ্ট্য এবং বিধিনিষেধ রয়েছে:

সেগুলি অবশ্যই ডেটা থেকে তৈরি করা উচিত যা সংকলন সময়ে গণনা করা যায়। কোনও কনট কনট অবজেক্টের এমন কোনও কিছুর অ্যাক্সেস নেই যা রানটাইমের সময় আপনার গণনা করতে হবে। 1 + 2 একটি বৈধ কনস্ট এক্সপ্রেশন, তবে নতুন ডেটটাইম.নো () এটি নয়।

তারা গভীরভাবে, অস্থায়ীভাবে পরিবর্তনযোগ্য। আপনার যদি সংগ্রহ সহ একটি চূড়ান্ত ক্ষেত্র থাকে, তবে সংগ্রহটি এখনও পরিবর্তনযোগ্য হতে পারে। যদি আপনার কাছে কনস্টের সংগ্রহ থাকে তবে এর প্রত্যেকটি জিনিস অবশ্যই পুনরাবৃত্তভাবে কনস্ট হওয়া উচিত।

তারা ক্যানোনিকালাইজড হয় । এটি স্ট্রিং ইন্টার্নিংয়ের মতো: কোনও নির্দিষ্ট কনস্ট মানের জন্য, একক কনস্ট অবজেক্ট তৈরি করা হবে এবং পুনরায় ব্যবহার করা হবে না কেন কনস্ট এক্সপ্রেশন (গুলি) যতবার মূল্যায়ন করা হয়।


তাহলে এর অর্থ কি?

কনস্ট: আপনার
যদি মানটি রানটাইমের সময় গণনা করা হয় ( new DateTime.now()উদাহরণস্বরূপ), আপনি এটির জন্য কোনও কনস্ট ব্যবহার করতে পারবেন না । তবে, সংকলনের সময় যদি মানটি জানা থাকে (তবে const a = 1;) আপনার ব্যবহার constকরা উচিত final। সেখানে 2 এর মধ্যে অন্যান্য বৃহৎ পার্থক্য আছে constএবং final। প্রথমত, আপনি যদি ব্যবহার করেন তবে আপনাকে constএটিকে ন্যায়বিচারের static constচেয়ে ঘোষণা করতে হবে const। দ্বিতীয়ত, আপনার যদি constসংগ্রহ থাকে তবে এর ভিতরে থাকা সমস্ত কিছুই const। আপনার যদি finalসংগ্রহ থাকে তবে এর ভিতরে থাকা সমস্ত কিছুই final

চূড়ান্ত: আপনি যদি সংকলনের সময় মানটি না জানেন তবে
finalএটি ব্যবহার করা উচিত constএবং এটি রানটাইমে গণনা করা / ধরা হবে। আপনি যদি কোনও এইচটিটিপি প্রতিক্রিয়া চান যা পরিবর্তন করা যায় না, আপনি যদি কোনও ডাটাবেস থেকে কিছু পেতে চান বা কোনও স্থানীয় ফাইল থেকে পড়তে চান তবে ব্যবহার করুন final। কিছু আছে যে কম্পাইল সময়ে পরিচিত করা উচিত হবে না finalধরে const


সঙ্গে যে হচ্ছে সকলে বলল, উভয় constএবং finalপুনরায় নির্ধারণ করা যাবে না, কিন্তু একটি ক্ষেত্র finalবস্তু, যতদিন তারা না constবা final, (অসদৃশ পুনরায় নির্ধারণ করা যেতে পারে const)।


3
কনস্ট-টাইম ধ্রুবককে প্রতিনিধিত্ব করতে কনস্ট কীওয়ার্ড ব্যবহার করা হয়। কনস্টের শব্দটি ব্যবহার করে ঘোষিত চলকগুলি সুস্পষ্টভাবে চূড়ান্ত।
অরুণ জর্জ

1
@ মাইয়ী, আমাদের কখন ব্যবহার করা উচিত constএবং কখন final? আপনি কি এই সংশোধকটির জন্য কোনও প্রকারের ব্যবহার-কেস জানেন?
কক্সঅনরোড


2
এই শেষ বাক্যটি সত্যিই এটি এত ভাল পরিমাণে যোগ করে। তার জন্য ধন্যবাদ.
ইয়াস্টার

আমাদের কি এমনকি যত্ন নেওয়া উচিত যে কনস্টের একটি বিকল্প? পারফরম্যান্স লাভ কি আসলেই উপলব্ধিযোগ্য?
কোডগ্রু

63

const

সংকলন সময়ে মান অবশ্যই জানা উচিত , const birthday = "2008/12/26"
আরম্ভ করার পরে পরিবর্তন করা যাবে না।


চূড়ান্ত

রান রান সময়ে মান অবশ্যই জানা উচিত , final birthday = getBirthDateFromDB()
আরম্ভ করার পরে পরিবর্তন করা যায় না Can


10
সবচেয়ে সহজ এবং সর্বোত্তম ব্যাখ্যা।
অঙ্কুর লাহারি

1
এটিকে পছন্দ করেছেন :)
ফয়সাল নাসির

43

একীভূত @ মাইয়ি এবং @ ফয়সাল-নাসির উত্তর এবং সামান্য প্রোগ্রামিংয়ের সাথে তুলনা করা।

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

আমরা ব্যবহার করতে পারি একটি তালিকার কাছে কনস্টওয়ার্ড

কনট ক = কনস্ট [] - একটি পরিবর্তনশীল a সূচনাযুক্ত constযা constবস্তুর একটি তালিকা রয়েছে (যেমন, তালিকায় কেবল সংকলন সময় ধ্রুবক এবং অপরিবর্তনীয় বস্তু থাকতে হবে) contain সুতরাং আমরা 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

উত্তরটি @ মাইয়ি দ্বারা প্রসারিত করা হচ্ছে

  • চূড়ান্ত পরিবর্তনশীল কেবল একবার সেট করা যেতে পারে এবং অ্যাক্সেস করা হলে এটি সূচনা করা হয় example উদাহরণস্বরূপ নীচের কোড বিভাগ থেকে আপনি যদি এর মানটি ব্যবহার করেন biggestNumberOndiceতবেই মানটি আরম্ভ করা হবে এবং মেমরি নির্ধারিত হবে))
  • কনস্ট অভ্যন্তরীণভাবে প্রকৃতিতে চূড়ান্ত তবে মূল পার্থক্যটি হ'ল এর সংকলন সময় ধ্রুবকটি যা সংকলনের সময় আরম্ভ করা হয় এমনকি আপনি যদি এর মানটি ব্যবহার না করেন তবে এটি আরম্ভ হবে এবং মেমরিতে স্থান নেবে।

  • ক্লাস থেকে পরিবর্তনশীল চূড়ান্ত হতে পারে তবে ধ্রুবক হতে পারে না এবং আপনি যদি শ্রেনী স্তরে একটি ধ্রুবক চান তবে এটি স্থির প্রতিবন্ধী করুন।

কোড:

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
আমি মনে করি প্রশ্নটি জিজ্ঞাসা করার একটি আরও ভাল উপায় হ'ল কখন সংকলন সময়
ফয়সাল নাসির

এবং তার জন্য আপনি @ মাইয়ের উত্তরের সাথে পরামর্শ করতে পারেন এবং নিবন্ধটির লিঙ্কটি তার পোস্ট থেকে এটি দুর্দান্ত দেখতে পেয়েছেন :)
ফয়সাল নাসির

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সংকলন-সময় প্রাপ্ত হওয়া মানগুলি সূচনা করতে সক্ষম হয়ে যায় being

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


2

final এবং const ডার্ট এ স্তরের জন্য বিভ্রান্তিকর হয় যা আমরা মনে করি উভয়ই একই।

আসুন তাদের পার্থক্য দেখুন:

PS আমি স্ট্যাকওভারফ্লো। এমডি ফর্ম্যাটে সহজেই তথ্যটি টেবলেট করতে না পারায় পাঠ্যের পরিবর্তে চিত্রটি অন্তর্ভুক্ত করেছি।


1

আপনার কাছ থেকে আসছে হয় C++তারপর constমধ্যে Dartহয় constexprমধ্যে C++এবং finalমধ্যে Dartহয় constমধ্যে C++

উপরেরগুলি আদিম ধরণের ক্ষেত্রে প্রযোজ্য। তবে Dartচিহ্নিত বস্তুগুলিতে finalএর সদস্যদের ক্ষেত্রে পরিবর্তনীয়।


2
প্রকার, রকম. আমি মনে করি আপনি এটি আদিম ধরণের জন্য বলতে পারেন তবে বস্তুর জন্য নয়। constসি ++ এ প্রায় সর্বদা নির্দিষ্ট করার জন্য ব্যবহৃত হয় যে কোনও নির্দিষ্ট রেফারেন্স বা পয়েন্টারের মাধ্যমে কোনও বস্তু পরিবর্তনযোগ্য নয়। finalডার্টে বস্তুটিকে সেই পরিবর্তনশীল মাধ্যমে পরিবর্তিত হতে বাধা দেয় না।
জেমসডলিন

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

কোন শব্দটি কখন ব্যবহার করবেন?

উভয়ের জন্য একটি সাধারণ উদাহরণ: চূড়ান্ত ব্যবহার করুন: সংকলন সময়ে এর মান কী হবে তা যদি আপনি না জানেন। উদাহরণস্বরূপ, যখন আপনাকে কোনও এপিআই থেকে ডেটা পাওয়ার প্রয়োজন হতে পারে, আপনার কোড চালানোর সময় এটি ঘটে।

কনস্ট ব্যবহার করুন: আপনি যদি নিশ্চিত হন যে আপনার কোডটি চালানোর সময় কোনও মান পরিবর্তন করা যাচ্ছে না। উদাহরণস্বরূপ, আপনি যখন কোনও বাক্য ঘোষণা করেন যা সর্বদা একই থাকে।

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

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.