স্ট্যাটিক রিডোনলি বনাম কনস্ট


1386

আমি প্রায় constএবং static readonlyক্ষেত্রের কাছাকাছি পড়েছি । আমাদের কয়েকটি ক্লাস রয়েছে যার মধ্যে কেবল ধ্রুবক মান রয়েছে। আমাদের সিস্টেমের চারপাশে বিভিন্ন জিনিসের জন্য ব্যবহৃত। তাই আমি ভাবছি যে আমার পর্যবেক্ষণটি সঠিক কিনা:

এই ধরণের ধ্রুবক মানগুলি সর্বদা static readonlyসর্বজনীন যে সমস্ত কিছুর জন্য হওয়া উচিত ? এবং শুধুমাত্র constঅভ্যন্তরীণ / সুরক্ষিত / ব্যক্তিগত মানগুলির জন্য ব্যবহার করবেন?

আপনি কি সুপারিশ করেন? আমার সম্ভবত static readonlyক্ষেত্রগুলি ব্যবহার না করা , তবে সম্ভবত বৈশিষ্ট্যগুলি ব্যবহার করা উচিত?


5
এখানে আমি খুব আকর্ষণীয় একক কেসটি পেয়েছি যা কেবলমাত্র আমি পেয়েছি static readonly: একটি কনস্টের ভিতরে IEnumeratorএমন কনস্ট ব্যবহার করার চেষ্টা করুন যা একটি অপ্রাপ্যযোগ্য ট্রিগার করতে পারেyield এবং আপনি একটি ভয়ঙ্কর "অভ্যন্তরীণ সংকলক ত্রুটি" পেয়ে যাবেন । আমি Unity3D বাহিরে কোড পরীক্ষা করা হয়নি, কিন্তু আমি বিশ্বাস কর এটা হয় একটি হল মনো বা .NET বাগ । তবুও এটি একটি সি # ইস্যু।
ক্রেগক্স


8
আর একটি পার্থক্য হ'ল আপনি একটি স্যুইচটিতে
কনস্ট

7
static readonlyswitch-caseবিবৃতিতে caseপরিবর্তনশীল হিসাবে ব্যবহার করা যায় না , constএই উদ্দেশ্যে প্রয়োজন।
মোস্তাফিজ রহমান

3
static readonlyঅ্যাট্রিবিউট প্যারামিটার হিসাবেও ব্যবহার করা যাবে না
ড্রেড বয়

উত্তর:


940

public static readonlyক্ষেত্রগুলি একটু অস্বাভাবিক; public staticবৈশিষ্ট্যগুলি (কেবলমাত্র একটি সহ get) আরও সাধারণ হবে (সম্ভবত কোনও private static readonlyক্ষেত্র দ্বারা সমর্থনযুক্ত)।

constমানগুলি কল-সাইটে সরাসরি পোড়ানো হয়; এটি দ্বি প্রান্তযুক্ত:

  • এটি রানহীন সময়ে, সম্ভবত কনফিগার থেকে মান আনা হলে এটি অকেজো less
  • আপনি যদি কোনও কনস্টের মান পরিবর্তন করেন তবে আপনাকে সমস্ত ক্লায়েন্টকে পুনর্নির্মাণ করতে হবে
  • তবে এটি দ্রুত হতে পারে, কারণ এটি কোনও পদ্ধতি কল এড়ায় ...
  • ... যা কখনও কখনও যাহাই হউক না কেন জেআইটি দ্বারা অন্তর্ভুক্ত ছিল

মানটি কখনই পরিবর্তিত হয় না , তবে Zeroকনটটি ঠিক আছে - ইত্যাদি যুক্তিসঙ্গত কনসেটগুলি তৈরি করুন; p এর বাইরে, staticবৈশিষ্ট্যগুলি বেশি সাধারণ।


13
জমির উপর সম্পত্তি কেন? যদি এটি অপরিবর্তনীয় শ্রেণি হয় তবে আমি কোনও পার্থক্য দেখি না।
মাইকেল হেজ্পেপথ

73
@ মিশেল - সর্বদা হিসাবে একই কারণ; এটি বাস্তবায়ন গোপন করে। আপনি খুঁজে পেতে পারেন (পরে) আপনার অলস বোঝা, কনফিগারেশন ভিত্তিক, একটি ফ্যাসাদ বা যা কিছু হতে হবে। বাস্তবে, হয় প্রায়ই জরিমানা হবে ...
মার্ক Gravell

42
সংজ্ঞা অনুসারে @ কফি অ্যাডিক্ট, একটি ধ্রুবক একটি কনফিগার ফাইল থেকে মান টানছে না ; এটি সংকলন সময়ে আক্ষরিক হিসাবে পোড়ানো হয়। রানটাইমের সময় আপনি কেবল ধ্রুবকটি ব্যবহার করতে পারেন তা হল ক্ষেত্রগুলির প্রতিচ্ছবি। অন্য যে কোনও সময় আপনি এটি ব্যবহার করার চেষ্টা করার পরে, সংকলকটি ইতিমধ্যে আক্ষরিক ব্যবহারের জন্য আপনার ধ্রুবক ব্যবহারকে প্রতিস্থাপন করেছে ; অর্থাত্ যদি আপনার কোডের কোনও পদ্ধতিতে 6 টি ধ্রুবক ব্যবহার করা হয় এবং আপনি এটি আইএল হিসাবে পরিদর্শন করেন তবে কোনও ধ্রুবক অনুসন্ধানের উল্লেখ থাকবে না; আক্ষরিক মানগুলি কেবল ইন-
সিটুতে

37
@ মার্কগ্রাভেল - সতর্কতা: readonlyক্ষেত্রগুলি স্যুইচ / কেস স্টেটমেন্টে ব্যবহার করা যাবে না, পরিবর্তে আপনার সেগুলি হওয়া দরকার const
লুকিয়ানো

7
@ ডিডিবাস কোনও সম্পত্তিতে ক্ষেত্র পরিবর্তন করা আসলে এপিআই ভাঙতে পারে। সি # তে একটি ক্ষেত্র কার্যকরভাবে ভেরিয়েবলের মতো কাজ করে, যখন সি # তে থাকা একটি সম্পত্তি গেটর পদ্ধতি এবং / অথবা একটি সেটার পদ্ধতি লেখার জন্য একটি সিনট্যাক্স সহায়ক। এই পার্থক্যটি গুরুত্বপূর্ণ যখন অন্যান্য সমাবেশগুলি জড়িত থাকে। আপনি যদি কোনও ক্ষেত্রকে কোনও সম্পত্তিতে পরিবর্তন করেন এবং অন্যান্য সমাবেশগুলি এই ক্ষেত্রের উপর নির্ভরশীল হয়, তবে সেই অন্যান্য সমাবেশগুলি পুনরায় সংযুক্ত করতে হবে।
স্টিফেন বোহর

237

গ্রাহকstatic readonly যদি অন্য কোনও সমাবেশে থাকে তবে আমি ব্যবহার করব । রয়ে এবং উপভোক্তা দুটি ভিন্ন মজলিসে একটা চমৎকার উপায় নিজেকে পায়ে গুলিconst


5
সুতরাং আমি মনে করি যেহেতু কেউ কেউ উল্লেখ করেছেন বা ইঙ্গিত করেছেন, কেবলমাত্র সেই মানগুলির জন্য কেবল কনস্ট ব্যবহার করা বুদ্ধিমানের কাজ হতে পারে যা যদি জনসমক্ষে প্রকাশ করা হয় অন্যথায় সেগুলি অভ্যন্তরীণ, সুরক্ষিত, বা ব্যক্তিগত অ্যাক্সেসের জন্য সংরক্ষণ করা উচিত।
jpierson

1
@ ডিও এটি বিদ্যমান থাকার কারণটি হ'ল এটি প্রতি প্রতি ইস্যু নয় - এটি সচেতন হওয়ার মতো বিষয়, তবে সমাবেশের সীমানা পেরিয়ে কনসাল্ট ইনলাইন করার দক্ষতা পারফরম্যান্সের জন্য একটি ভাল জিনিস। "ধ্রুবক" এর অর্থ "এটি কখনই পরিবর্তিত হবে না" এটি সত্যই বোঝার বিষয় মাত্র।
মাইকেল Stum

1
@ মিশেলস্টাম ঠিক আছে আমাকে এটিকে "একটি সমস্যা" বলা উচিত নয়। আমার কাজের লাইনে, আমি এগুলি সমাবেশগুলির মধ্যে স্থির করে ভাগ করে নিতে পারি তবে আমি প্রতিটি স্থাপনা বা কোড চালানের জন্য পুনরায় কম্পাইল করি। তবুও, এই সত্যটি অবশ্যই এটি নোট করা মূল্যবান।
Dio Phung

1
সুতরাং, সাধারণভাবে, internal constবা public static readonlyকাঙ্ক্ষিত দৃশ্যমানতার উপর নির্ভর করে।
আইরিডন

2
@ ইরদিনা হ্যাঁ, এটি দেখার পক্ষে এটি কোনও খারাপ উপায় নয়। কয়েকটি এজ-কেস বিবেচনা করতে হবে (যেমন, যদি প্রতিবিম্ব ব্যবহার করা হয়, বা যদি কোনও গুণকের জন্য কোনও মান প্রয়োজন হয়), এবং এর জন্য বৈধ ব্যবহার রয়েছে public const(যেমন, কোনও মানের কোনও অংশ। নামব্যবধান একটি গুচ্ছ ফাইল public const string।) তবে সাধারণভাবে, public constশুধুমাত্র প্রভাব সঠিকভাবে বিবেচনা করার পর ব্যবহার করা উচিত।
মাইকেল স্টাম

199

আরও কয়েকটি প্রাসঙ্গিক বিষয় লক্ষণীয়:

const int a

  • শুরু করা আবশ্যক।
  • আরম্ভের সময় অবশ্যই সংকলন সময় হতে হবে ।

readonly int a

  • আরম্ভ না করেই একটি ডিফল্ট মান ব্যবহার করতে পারে।
  • সূচনাটি রান সময়ে করা যেতে পারে (সম্পাদনা করুন: কেবলমাত্র নির্মাণকারীর মধ্যে)।

39
মধ্যে ctorশুধুমাত্র।
অমিত কুমার ঘোষ

1
কেবলমাত্র নির্মাণকারীর মধ্যেই নয় তবে ঘোষণাপত্রেও ( ডকস.মাইক্রোসফট.ইন / ডটনেট / সিএসআরপি / ভাষা-রেফারেন্স / ))।
ডিক্রিস্টো

176

এটি অন্যান্য উত্তরের পরিপূরক মাত্র। আমি তাদের পুনরাবৃত্তি করব না (এখন চার বছর পরে)।

এমন পরিস্থিতি রয়েছে যেখানে একটি constএবং অ-কনস্ট্যান্টের আলাদা শব্দার্থক শব্দ রয়েছে। উদাহরণ স্বরূপ:

const int y = 42;

static void Main()
{
  short x = 42;
  Console.WriteLine(x.Equals(y));
}

প্রিন্ট আউট True, যেখানে:

static readonly int y = 42;

static void Main()
{
  short x = 42;
  Console.WriteLine(x.Equals(y));
}

লিখেছেন False

কারণ পদ্ধতি x.Equalsদুই overloads, এক একটি লাগে হয়েছে short( System.Int16) এবং যে সময় লাগে object( System.Object)। এখন প্রশ্ন আমার বা এক সাথে উভয়ই প্রয়োগ করবেন কিনাy যুক্তি ।

যখন yএকটি কম্পাইল-টাইম ধ্রুবক (আক্ষরিক) হল, constমামলা, এটা গুরুত্বপূর্ণ হয়ে ওঠে যে, সেখানে একটা অন্তর্নিহিত রূপান্তর বিদ্যমান থেকে int থেকে short প্রদান করা intএকটি ধ্রুবক রয়েছে এবং প্রদত্ত যে C # এর কম্পাইলার যাচাই করে জানাচ্ছেন যে তার মান একটি পরিসীমা মধ্যে short( যা 42)। সি # ভাষা নির্দিষ্টকরণে অন্তর্নিহিত ধ্রুবক অভিব্যক্তি রূপান্তরগুলি দেখুন । সুতরাং উভয়ই ওভারলোডগুলি বিবেচনা করতে হবে। জমিদার Equals(short)পছন্দ করা হয় (যে কোন shortএকটি হয় objectতবে সব নয় objectহয় short)। সুতরাং yরূপান্তরিত হয় short, এবং যে ওভারলোড ব্যবহৃত হয়। তারপরে অভিন্ন মানের Equalsদুটি তুলনা করে shortএবং এটি দেয়true

যখন yএকটি ধ্রুবক নয়, কোন অন্তর্নিহিত থেকে রুপান্তরের intজন্য shortবিদ্যমান। এটি কারণ সাধারণভাবে একটি এ intখুব ফিট হতে পারে short। (একটি সুস্পষ্ট রূপান্তর বিদ্যমান, তবে আমি বলিনি Equals((short)y), তাই এটি প্রাসঙ্গিক নয়)) আমরা দেখতে পাচ্ছি যে কেবলমাত্র একটি ওভারলোড প্রযোজ্য Equals(object)one তাই yবক্স করা হয় object। তারপরে Equalsএকটি এর System.Int16সাথে একটি তুলনা করতে চলেছে System.Int32, এবং যেহেতু রান-টাইম ধরণেরগুলিও একমত হয় না, ফলন হবেfalse

আমরা উপসংহারে পৌঁছেছি যে কিছু (বিরল) ক্ষেত্রে ক্ষেত্রে কোনও constপ্রকার সদস্যকে static readonlyক্ষেত্রের (বা অন্য উপায়ে যখন সম্ভব হয়) পরিবর্তন করা প্রোগ্রামটির আচরণ পরিবর্তন করতে পারে।


17
গৃহীত উত্তরের একটি ভাল সংযোজন। আমি যুক্ত করতে চাই যে ডেটা ধরণের যথাযথ রূপান্তর এবং অন্যান্য অনুরূপ নির্দেশিকা (যেমন ট্র্যাচ ক্যাচস ইত্যাদি) অভিজ্ঞ প্রোগ্রামারগুলির প্রধান হওয়া উচিত এবং সংকলকটিতে রেখে দেওয়া উচিত নয়। তবুও আমি এখান থেকে নতুন কিছু শিখেছি। ধন্যবাদ.
ইউকনাইট

বাহ, আমি দীর্ঘদিন ধরে সি # তে প্রোগ্রামিং করছি এবং আমি কখনই অনুমান করতে পারি নি যে একটি সংক্ষিপ্তের পরিসরের মধ্যে একটি কনট ইন্টিস্ট্রি স্পষ্টভাবে একটি সংক্ষিপ্ত রূপান্তরিত হতে পারে। আমি অবশ্যই বলতে চাই এটি বিজোড়। আমি সি # পছন্দ করি তবে এই অদ্ভুত অসঙ্গতিগুলি যে খুব বেশি মান যোগ করে না বলে মনে হয় না বরং ক্রমাগত বিবেচনা করার জন্য প্রয়োজনীয় মস্তিষ্কের শক্তি যোগ করে বিরক্তিকর হতে পারে, বিশেষত নবজাতকদের জন্য।
মাইক মেরিনোভস্কি

পছন্দ করুন তবে আমি মনে করি তারা বিবৃতিটিকে short x = 42;আইনী করার জন্য (অন্যান্য কারণে) সেই নিয়ম তৈরি করেছিলেন । কারণ সেখানে আপনার কাছে একটি intঅর্থাত্ আক্ষরিক 42, যা স্পষ্টতই রূপান্তরিত হয় short x। তবে তারপরে, তারা এটিকে কেবল সংখ্যাসূচক আক্ষরিক মধ্যে সীমাবদ্ধ রেখেছিল; যাইহোক, তারা short x = y;যেখানে yহিসাবে সংজ্ঞায়িত হয়েছে এমন জিনিসগুলিকেও অনুমতি দেওয়া বেছে নিয়েছিল const int y = 42;এবং তারপরে তারা এগুলি দিয়ে শেষ হয়েছিল।
জেপ্পে স্টিগ নীলসন

87

নোটটিতে এক জিনিস const (ব্যতিক্রম হচ্ছে স্ট্রিং) আদিম / মান ধরনের অবধি সীমিত থাকবে


30
প্রকৃতপক্ষে constঅন্যান্য ধরণের ক্ষেত্রেও এটি ব্যবহার করা যেতে পারে তবে এটি শূন্যে শুরু করতে হবে যা এটি অকেজো করে তোলে :)
নওফাল

6
ব্যতিক্রম হিসাবে হিসাবে System.Exception? :)
মেমেট ওলসেন

4
আরো অবিকল @nawfal, শুধুমাত্র মান ধরনের , যার জন্য constব্যবহার করা যেতে পারে হয় sbyte, byte, short, ushort, int, uint, long, ulong, char, float, double, decimal, bool, প্লাস কোনো enumধরনের। constএর মতো অন্যান্য মান ধরনের জন্য ব্যবহার করা যাবে না DateTimeবা TimeSpanবা BigInteger। এটি IntPtrস্ট্রাক্টের জন্যও ব্যবহার করা যায় না (কারও কারও কাছে "আদিম" প্রকার হিসাবে বিবেচিত হয়; আদিম টাইপ শব্দটি সি # তে বিভ্রান্তিকর)। All constসমস্ত রেফারেন্স ধরণের জন্য ব্যবহার করা যেতে পারে । প্রকারটি যদি হয় তবে যে stringকোনও স্ট্রিংয়ের মান নির্দিষ্ট করা যায়। অন্যথায়, মানটি অবশ্যই হবে null
জেপ্প স্টিগ নীলসেন

@ জেপ্পস্টিগনিয়েলসন - সম্প্রতি এই সম্পর্কে আমার সাথে সার্ভিসের সাথে একটি বিতর্ক হয়েছিল - তিনি উল্লেখ করেছিলেন যে আপনি যে কোনও কিছু (মান এবং রেফারেন্সের ধরণ) constব্যবহার করে করতে পারেন default। জন্য structধরনের, এটা তার সকল সদস্যদের ডিফল্ট মান সেট সঙ্গে একটি দৃষ্টান্ত আছে।
ওয়াই হা লি

28

স্ট্যাটিক কেবল পঠন : staticরানটাইমে কনস্ট্রাক্টরের মাধ্যমে মান পরিবর্তন করা যায় । তবে সদস্য ফাংশনের মাধ্যমে নয়।

ধ্রুবক : ডিফল্টরূপে static। মান কোথাও থেকে পরিবর্তন করা যাবে না (কর্টর, ফাংশন, রানটাইম ইত্যাদি নো-কোথাও)।

কেবল পঠনযোগ্য : রানটাইমে কনস্ট্রাক্টরের মাধ্যমে মান পরিবর্তন করা যায়। তবে সদস্য ফাংশনের মাধ্যমে নয়।

আমার রেপোতে আপনি একবার দেখতে পারেন: সি # সম্পত্তি ধরণের


1
খারাপ খবর ... ভাঙা লিঙ্ক!
ফের আর

2
@ ফেয়ার আপনি সেখানে যান: গিথুব.com
আবেদীন সিয়াম

ভাল স্নিপেটস সিয়াম ভাই :)
মুহাম্মদ আশিকুজ্জামান

25

মূল readonlyশব্দটি কীওয়ার্ডের থেকে পৃথক const। একটি constক্ষেত্র কেবল পঠন ক্ষেত্র ঘোষণা এ সক্রিয়া করা যেতে পারে। readonlyঘোষণায় বা কনস্ট্রাক্টারে একটি ক্ষেত্র সূচনা করা যেতে পারে। সুতরাং, readonlyক্ষেত্রগুলির ব্যবহারকারীর উপর নির্ভর করে বিভিন্ন মান থাকতে পারে। এছাড়াও, যখন constক্ষেত্রটি একটি সংকলন-সময় ধ্রুবক হয়, readonlyক্ষেত্রটি রানটাইম ধ্রুবকগুলির জন্য ব্যবহৃত হতে পারে

সংক্ষিপ্ত এবং পরিষ্কার এমএসডিএন রেফারেন্স এখানে


16

const এবং readonly অনুরূপ, কিন্তু তারা ঠিক এক নয়।

একটি constক্ষেত্রটি একটি সংকলন-সময় ধ্রুবক, যার অর্থ যে সংকলন-সময় সেই মানটি গণনা করা যায়। একটি readonlyক্ষেত্র অতিরিক্ত পরিস্থিতি সক্ষম করে যাতে টাইপটি নির্মাণের সময় কিছু কোড চালানো আবশ্যক। নির্মাণের পরে, একটি readonlyক্ষেত্র পরিবর্তন করা যাবে না।

উদাহরণস্বরূপ, constসদস্যদের যেমন সদস্যদের সংজ্ঞা দিতে ব্যবহার করা যেতে পারে:

struct Test
{
    public const double Pi = 3.14;
    public const int Zero = 0;
}

যেহেতু 3.14 এবং 0 এর মতো মানগুলি সংকলন-সময় ধ্রুবক। যাইহোক, আপনি যেখানে কোনও প্রকারটি সংজ্ঞায়িত করেন এবং এর প্রাক প্রাক-উদাহরণ সরবরাহ করতে চান সেই ক্ষেত্রে বিবেচনা করুন। উদাহরণস্বরূপ, আপনি একটি রঙের শ্রেণি সংজ্ঞায়িত করতে এবং কালো, সাদা ইত্যাদির মতো সাধারণ রঙগুলির জন্য "ধ্রুবকগুলি" সরবরাহ করতে চাইতে পারেন, কনস্টের সদস্যদের সাথে এটি করা সম্ভব নয়, কারণ ডান হাতের পক্ষগুলি সংকলন-সময় ধ্রুবক নয়। নিয়মিত স্থিতিশীল সদস্যদের সাথে কেউ এটি করতে পারে:

public class Color
{
    public static Color Black = new Color(0, 0, 0);
    public static Color White = new Color(255, 255, 255);
    public static Color Red   = new Color(255, 0, 0);
    public static Color Green = new Color(0, 255, 0);
    public static Color Blue  = new Color(0, 0, 255);
    private byte red, green, blue;

    public Color(byte r, byte g, byte b) => (red, green, blue) = (r, g, b);
}

তবে তারপরে রঙের কোনও ক্লায়েন্টকে ম্যাকিং থেকে বিরত রাখার মতো কিছুই নেই, সম্ভবত কালো এবং সাদা মানগুলি অদলবদল করে। বলা বাহুল্য, এটি রঙ শ্রেণীর অন্যান্য ক্লায়েন্টদের জন্য কনসেন্টেশন সৃষ্টি করবে। "পঠনযোগ্য" বৈশিষ্ট্যটি এই দৃশ্যের ঠিকানা দেয়।

কেবল পরিচয় দিয়ে readonlyঘোষণাপত্রগুলিতে কীওয়ার্ডটি করার মাধ্যমে ক্লায়েন্ট কোডটিকে চারপাশে ঠাট্টা করা থেকে বিরত করার সময় আমরা নমনীয় সূচনাটি সংরক্ষণ করি।

public class Color
{
    public static readonly Color Black = new Color(0, 0, 0);
    public static readonly Color White = new Color(255, 255, 255);
    public static readonly Color Red   = new Color(255, 0, 0);
    public static readonly Color Green = new Color(0, 255, 0);
    public static readonly Color Blue  = new Color(0, 0, 255);
    private byte red, green, blue;

    public Color(byte r, byte g, byte b) => (red, green, blue) = (r, g, b);
}

এটি লক্ষণীয় আকর্ষণীয় যে কনস্টের সদস্যরা সর্বদা স্থির থাকে, তবে কেবলমাত্র নিয়মিত ক্ষেত্রের মতোই কেবল পাঠযোগ্য সদস্যরা স্থির হয় বা নাও হতে পারে।

এই দুটি উদ্দেশ্যে একটি একক কীওয়ার্ড ব্যবহার করা সম্ভব তবে এটি সংস্করণে সমস্যা বা পারফরম্যান্স সমস্যার কারণ হতে পারে। এক মুহুর্তের জন্য ধরে নিন যে আমরা এই (কনস্ট্যান্ট) জন্য একটি একক কীওয়ার্ড ব্যবহার করেছি এবং একজন বিকাশকারী লিখেছেন:

public class A
{
    public static const C = 0;
}

এবং অন্য বিকাশকারী কোড লিখেছেন যা এ:

public class B
{
    static void Main() => Console.WriteLine(A.C);
}

এখন, উত্পন্ন কোডটি কি এসি একটি সংকলন-সময় ধ্রুবক এর উপর নির্ভর করতে পারে? অর্থাত, এসি ব্যবহারের ফলে কেবল 0 মানটি প্রতিস্থাপন করা যাবে? আপনি যদি এটিকে "হ্যাঁ" বলে থাকেন তবে তার অর্থ হ'ল এ এর ​​বিকাশকারী এসি শুরু করার উপায়টি পরিবর্তন করতে পারে না - এটি অনুমতি ছাড়াই এ এর ​​বিকাশকারীদের হাত বাঁধে।

আপনি যদি এই প্রশ্নের "না" বলেন তবে একটি গুরুত্বপূর্ণ অপটিমাইজেশন মিস হয়ে গেছে। সম্ভবত এ এর ​​লেখক ইতিবাচক যে এসি সর্বদা শূন্য থাকবে। কনস্ট এবং পঠন উভয়ের ব্যবহার এ এর ​​বিকাশকারীকে উদ্দেশ্য নির্দিষ্ট করতে দেয় allows এটি উন্নত সংস্করণ আচরণ এবং আরও ভাল কর্মক্ষমতা তৈরি করে।


12

আমার পছন্দটি কনস্ট ব্যবহার করা আমি যখনই পারি যা উপরে উল্লিখিত হিসাবে আক্ষরিক প্রকাশ বা এমন কিছু সীমাবদ্ধ যা মূল্যায়নের প্রয়োজন হয় না।

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


7

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

স্ট্যাটিক রিডঅনলি: একটি স্ট্যাটিক রিডোনলি টাইপ ভেরিয়েবলের মান রানটাইম এ নিয়োগ করা যেতে পারে বা সংকলনের সময় বরাদ্দ করা যেতে পারে এবং রানটাইমে পরিবর্তন করা যেতে পারে। তবে এই ভেরিয়েবলের মানটি কেবল স্থিতিশীল কন্সট্রাক্টরেই পরিবর্তন করা যায়। এবং আরও পরিবর্তন করা যায় না। এটি রানটাইমে একবার পরিবর্তন করতে পারে

তথ্যসূত্র: সি-শার্পকর্নার


6

একটি স্ট্যাটিক পঠনযোগ্য ক্ষেত্র সুবিধাজনক যখন অন্যান্য সমাবেশগুলিতে প্রকাশিত হয় এমন একটি মান যা পরবর্তী সংস্করণে পরিবর্তিত হতে পারে।

উদাহরণস্বরূপ, ধরুন যে Xসমাবেশটি একটি ধ্রুবককে নিম্নরূপভাবে প্রকাশ করেছে:

public const decimal ProgramVersion = 2.3;

যদি Yসমাবেশটি Xএই ধ্রুবকটিকে উল্লেখ করে এবং ব্যবহার করে, Yকম্পাইল করার সময় ২.৩ মান সমাবেশে বেক করা হবে । এর অর্থ হল যদি Xপরে ধ্রুবক সেটটি 2.4 এ পুনরায় সংযুক্ত করা হয় তবে Yএখনও পর্যন্ত 2.3 এর পুরানো মানটি ব্যবহার করা হবেY এ পুনরায় সংযুক্ত করা হয় তবে পুনরায় সংযুক্ত । একটি স্ট্যাটিক পাঠ্য ক্ষেত্র এই সমস্যাটি এড়িয়ে চলে।

এটি দেখার আরেকটি উপায় হ'ল ভবিষ্যতে যে কোনও মান পরিবর্তিত হতে পারে তা সংজ্ঞা অনুসারে ধ্রুবক নয় এবং তাই সে হিসাবে এটি উপস্থাপন করা উচিত নয়।


3

const:

  1. মান ঘোষণার পরে দেওয়া উচিত
  2. সময় ধ্রুবক সংকলন

শুধুমাত্র পাঠযোগ্য:

  1. কনস্ট্রাক্টর ব্যবহার করে মান ঘোষণার সময় বা রানটাইম দেওয়ার সময় দেওয়া যেতে পারে value মানটি ব্যবহৃত কনস্ট্রাক্টরের উপর নির্ভর করে।
  2. ধ্রুবক সময় চালান

3

কনস্ট : কনস্টের ভেরিয়েবলের মানগুলি ঘোষণার সাথে সংজ্ঞায়িত করতে হয় এবং তার পরে এটি পরিবর্তন হয় না। কনস্ট স্পষ্টতই স্থিতিশীল তাই শ্রেণি উদাহরণ তৈরি না করে আমরা সেগুলি অ্যাক্সেস করতে পারি। সংকলনের সময়ে এর একটি মান রয়েছে

কেবলমাত্র পঠনযোগ্য : রানটাইম চলক মানগুলি আমরা ঘোষণার সাথে সাথে রানটাইমটিতে কনস্ট্রাক্টর ব্যবহার করার সময় সংজ্ঞা দিতে পারি। কেবল পাঠযোগ্য ভেরিয়েবলগুলি ক্লাস উদাহরণ ছাড়াই অ্যাক্সেস করতে পারে না।

স্থির পঠনযোগ্য : স্ট্যাটিক রিডোনালি ভেরিয়েবল মানগুলি কেবলমাত্র স্ট্যাটিক কনস্ট্রাক্টরের মাধ্যমে ঘোষণা করার সময় আমরা সংজ্ঞায়িত করতে পারি তবে অন্য কোনও নির্মাণকারীর সাথে নয় se এই ভেরিয়েবলগুলিও আমরা ক্লাস উদাহরণ তৈরি না করে অ্যাক্সেস করতে পারি (স্ট্যাটিক ভেরিয়েবল হিসাবে)।

আমাদের যদি বিভিন্ন অ্যাসেম্বলিতে ভেরিয়েবল গ্রহণ করতে হয় তবে স্ট্যাটিক রিডোনলি আরও ভাল পছন্দ হবে lease দয়া করে নীচের লিঙ্কে সম্পূর্ণ বিশদটি দেখুন

https://www.stum.de/2009/01/14/const-strings-a-very-convenient-way-to-shoot-yourself-in-the-foot/


আপনি আমাকে উত্তরটি কেন কমিয়ে দিয়েছিলেন তা আমাকে বলতে পারেন, তাই আমি নিজের পাশাপাশি এখানেও আপডেট করতে পারি।
ব্যবহারকারী1756922

ডিভি নয়, তবে এটি হতে পারে যে এই উত্তরটি এখানে ইতিমধ্যে বিস্তৃত উত্তরগুলিতে সত্যিই কিছু যুক্ত করে না।
মার্ক এল।

প্রকৃতপক্ষে, জাভাতে ফিরে 90 এর দশকের শেষের দিকে আমাদের মনে হয়েছিল যে আমরা এক প্রকল্পে একাধিক লোককে ক্লাস ফাইলগুলির সাথে বিভিন্ন জার তৈরি করছিলাম যা আন্তঃক্রিয়াযুক্ত হয়েছিল (একে অপরকে রেফারেন্স করেছিল) এবং পাবলিক
কনস্টিং স্ট্রিংয়ের ভার্শন

2

সি #। নেট এ কনস্ট এবং স্ট্যাটিক রিডোনলি ফিল্ডের মধ্যে একটি সামান্য পার্থক্য রয়েছে

সংকলনের সময় কনটটি মান দিয়ে শুরু করতে হবে।

কনস্টটি ডিফল্ট স্থিতিশীল এবং ধ্রুবক মান দিয়ে আরম্ভ করা দরকার, যা পরে আর সংশোধন করা যায় না। এটি সমস্ত ডেটাটাইপ দিয়ে ব্যবহার করা যাবে না। প্রাক্তন তারিখের জন্য। এটি ডেটটাইম ডেটাটাইপ দিয়ে ব্যবহার করা যাবে না।

public const DateTime dt = DateTime.Today;  //throws compilation error
public const string Name = string.Empty;    //throws compilation error
public static readonly string Name = string.Empty; //No error, legal

কেবলমাত্র পঠনযোগ্য স্থির হিসাবে ঘোষণা করা যেতে পারে, কিন্তু প্রয়োজন হয় না। ঘোষণার সময় আরম্ভ করার দরকার নেই। কনস্ট্রাক্টর ব্যবহার করে একবার এটির মান নির্ধারণ বা পরিবর্তন করা যেতে পারে। সুতরাং একবার মাত্র পঠনযোগ্য ক্ষেত্রের মান পরিবর্তন করার সম্ভাবনা রয়েছে (এটি স্থির কিনা তা বিবেচনা করে না), যা কনস্টের সাথে সম্ভব নয়।


0

ধ্রুবকগুলি নামের বোঝার মতো, ক্ষেত্রগুলি পরিবর্তিত হয় না এবং কোডের সংকলনের সময় সাধারণত স্থিতিশীলভাবে সংজ্ঞায়িত হয়।

কেবলমাত্র পঠনযোগ্য ভেরিয়েবলগুলি এমন ক্ষেত্র যা নির্দিষ্ট অবস্থার অধীনে পরিবর্তন করতে পারে।

আপনি প্রথমে ধ্রুবকের মতো ঘোষণা করলে এগুলি আরম্ভ করা যেতে পারে তবে সাধারণত তারা কনস্ট্রাক্টরের অভ্যন্তর অবজেক্ট নির্মাণের সময় সূচনা করা হয়।

উপরোক্ত শর্তে, আরম্ভের পরে এগুলি পরিবর্তন করা যাবে না।

স্থির কেবল পঠনযোগ্য শোনার জন্য আমার কাছে দুর্বল পছন্দ বলে মনে হয়, যদি এটি স্থির থাকে এবং এটি কখনই পরিবর্তিত হয় না, তবে কেবল এটি সর্বজনীন কনস্ট ব্যবহার করুন, যদি এটি পরিবর্তন করতে পারে তবে এটি কোনও ধ্রুবক নয় এবং তারপরে, আপনার প্রয়োজনের উপর নির্ভর করে আপনি হয় পঠন ব্যবহার করতে পারেন - কেবলমাত্র বা কেবল একটি নিয়মিত পরিবর্তনশীল।

এছাড়াও, আরেকটি গুরুত্বপূর্ণ পার্থক্য হ'ল ধ্রুবকটি শ্রেণীর অন্তর্ভুক্ত, যখন কেবল পঠনযোগ্য ভেরিয়েবলটি উদাহরণের সাথে সম্পর্কিত!


0

একটি কনস্ট (সংকলন-সময়ে নির্ধারিত হচ্ছে) এমন ক্ষেত্রে ব্যবহার করা যেতে পারে যেখানে সুনির্দিষ্ট স্ট্যাটিক পারে না, যেমন স্যুইচ স্টেটমেন্ট বা অ্যাট্রিবিউট কনস্ট্রাক্টরের মতো। এটি কারণ কেবল পাঠযোগ্য ক্ষেত্রগুলি কেবল রান-টাইমে সমাধান করা হয় এবং কিছু কোড কনস্ট্রাক্টগুলিকে সংকলনের সময় আশ্বাস প্রয়োজন। একটি পঠনযোগ্য স্থির একটি নির্মাতায় গণনা করা যেতে পারে, যা প্রায়শই একটি প্রয়োজনীয় এবং দরকারী জিনিস। পার্থক্যটি কার্যকরী, যেমনটি আমার মতে তাদের ব্যবহার হওয়া উচিত।

মেমরি বরাদ্দের ক্ষেত্রে, কমপক্ষে স্ট্রিং (রেফারেন্স টাইপ হওয়া) এর সাথে, উভয়ই অভ্যন্তরীণ এবং কোনও অভ্যন্তরীণ উদাহরণটি রেফারেন্স করবে এতে কোনও পার্থক্য নেই বলে মনে হয়।

ব্যক্তিগতভাবে, আমার ডিফল্টটি কেবলমাত্র পড়ার মতো স্থিতিশীল, কারণ এটি আমার কাছে আরও শব্দার্থক এবং যৌক্তিক বোধ তৈরি করে, বিশেষত যেহেতু সংকলনের সময় বেশিরভাগ মান প্রয়োজন হয় না। এবং, যাইহোক, জনসাধারণের পঠনযোগ্য স্ট্যাটিকগুলি অস্বাভাবিক বা অস্বাভাবিক কিছু নয় যেমন চিহ্নিত উত্তরটি বলে: উদাহরণস্বরূপ, System.String.Emptyএটি একটি।


0

প্রকাশক মধ্যে আরেকটি পার্থক্য const এবং কেবলমাত্র স্ট্যাটিক মেমরি অ্যালোকেশন হয়।

একটি স্ট্যাটিক ক্ষেত্র সেই ধরণের উদাহরণের চেয়ে কোনও অবজেক্টের ধরণের হয়। ফলস্বরূপ, ক্লাসটি প্রথমবারের মতো উল্লেখ করা হলে স্থির ক্ষেত্রটি বাকী সময়ের জন্য স্মৃতিতে "বেঁচে থাকবে" এবং স্থির ক্ষেত্রের একই উদাহরণটি সমস্ত ধরণের দৃষ্টান্ত দ্বারা উল্লেখ করা হবে।

অন্যদিকে, একটি কনস্টের ক্ষেত্র "টাইপের একটি উদাহরণের সাথে সম্পর্কিত।

তাহলে deallocation স্মৃতির আপনার জন্য আরো গুরুত্বপূর্ণ, ব্যবহার করতে পছন্দ const । যদি গতি হয় তবে স্ট্যাটিক রিডোনলি ব্যবহার করুন ।

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