ইন। নেট কেন স্ট্রিং.এম্পটি কেবল একটি ধ্রুবকটির পরিবর্তে পড়া হয়? আমি কেবল ভাবছি যে এই সিদ্ধান্তের পিছনে যুক্তিটি কী ছিল তা যদি কেউ জানে কিনা।
ইন। নেট কেন স্ট্রিং.এম্পটি কেবল একটি ধ্রুবকটির পরিবর্তে পড়া হয়? আমি কেবল ভাবছি যে এই সিদ্ধান্তের পিছনে যুক্তিটি কী ছিল তা যদি কেউ জানে কিনা।
উত্তর:
মাইক্রোসফ্ট এখানে শেয়ার্ড সোর্স কমন ল্যাঙ্গুয়েজ ইনফ্রাস্ট্রাকচার ২.০ প্রকাশে ইঙ্গিত করে যেহেতু static readonly
পরিবর্তে ব্যবহার করা হয় সে কারণেই পরিচালনা না করা কোড ব্যবহার করা । ফাইলটি দেখতে হবে ।const
sscli20\clr\src\bcl\system\string.cs
খালি ধ্রুবকটি খালি স্ট্রিংয়ের মান ধরে। আমাদের স্ট্রিং কনস্ট্রাক্টরকে কল করতে হবে যাতে সংকলকটি এটি আক্ষরিক হিসাবে চিহ্নিত না করে।
এটি আক্ষরিক হিসাবে চিহ্নিত করার অর্থ হ'ল এটি কোনও ক্ষেত্র হিসাবে প্রদর্শিত হবে না যা আমরা স্থানীয় থেকে অ্যাক্সেস করতে পারি।
এই সহজ নিবন্ধটি থেকে আমি কোডপ্রজেক্টে এই তথ্যটি পেয়েছি ।
String.Empty
একার জন্য আর ব্যবহার না করার জন্য গুরুত্ব সহকারে বিবেচনা করছি ।
আমি এখানে অনেক বিভ্রান্তি এবং খারাপ প্রতিক্রিয়া আছে বলে মনে করি।
প্রথমত, const
ক্ষেত্রগুলি static
সদস্য ( উদাহরণ সদস্য নয় ) not
বিভাগের 10.4 সি # ভাষার স্পেসিফিকেশনের স্থিতি পরীক্ষা করুন।
ধ্রুবকগুলি স্থিতিশীল সদস্য হিসাবে বিবেচিত হলেও, একটি ধ্রুবক ঘোষণার জন্য কোনও স্ট্যাটিক সংশোধক প্রয়োজন হয় না বা অনুমতিও দেয় না।
তাহলে public const
সদস্যদের স্ট্যাটিক হয়, এক বিবেচনা না করতে পারে যে একটি ধ্রুবক একটি নতুন অবজেক্ট তৈরি করবে।
এটি প্রদত্ত, নিম্নলিখিত কোডের লাইনগুলি একটি নতুন অবজেক্ট তৈরির ক্ষেত্রে ঠিক একই কাজ করে।
public static readonly string Empty = "";
public const string Empty = "";
মাইক্রোসফ্টের একটি নোট এখানে 2 এর মধ্যে পার্থক্য ব্যাখ্যা করে:
পঠনযোগ্য কীওয়ার্ডটি কনস্টের মূলশব্দ থেকে আলাদা। কেবলমাত্র ক্ষেত্রের ঘোষণায় কনস্টের ক্ষেত্রটি আরম্ভ করা যেতে পারে। একটি পঠনক্ষেত্র ক্ষেত্রটি ঘোষণায় বা কনস্ট্রাক্টারে শুরু করা যেতে পারে। অতএব, কেবল পাঠ্য ক্ষেত্রের ব্যবহারকারীর উপর নির্ভর করে বিভিন্ন মান থাকতে পারে। এছাড়াও, যখন কোনও কনস্টের ক্ষেত্রটি একটি সংকলন-সময় ধ্রুবক হয়, পঠনযোগ্য ক্ষেত্রটি রানটাইম ধ্রুবকগুলির জন্য ব্যবহার করা যেতে পারে, ...
সুতরাং আমি দেখতে পাচ্ছি যে এখানে একমাত্র প্রশ্রয়জনক উত্তর হ'ল জেফ ইয়েটস।
const string
এবং static readonly string
একই জিনিস করছি। কনস্ট মানগুলি সংযুক্ত কোডে প্রতিস্থাপিত হয় যেখানে স্থির পাঠযোগ্য মানগুলি উল্লেখ করা হয়। আপনার যদি const
লাইব্রেরি এ-তে লাইব্রেরি বি ব্যবহার করা হয়, গ্রন্থাগার বি সেই const
চলকের সমস্ত রেফারেন্সকে তার আক্ষরিক মানের সাথে প্রতিস্থাপন করবে ; static readonly
পরিবর্তে যদি সেই পরিবর্তনশীল হয় তবে এটি উল্লেখ করা হবে এবং রানটাইমের সময় তার মান নির্ধারণ করা হবে।
String.Empty read only instead of a constant?
যদি আপনি কোনও স্ট্রিং স্থির করেন , তবে কম্পাইলারটি যেখানেই বলুন সেখানে প্রকৃত স্ট্রিংয়ের সাথে প্রতিস্থাপন করা হবে এবং আপনি আপনার কোডটি পুরো স্ট্রিং দিয়ে পূর্ণ করে ফেলবেন এবং যখন কোডটি চালায় তখন আলাদা আলাদা মেমরি থেকে সেই স্ট্রিংটি বার বার পড়তে হবে need ডেটা।
যদি আপনি আপনার স্ট্রিংটিকে কেবল একই জায়গায় পড়তে যান তবে String.Empty
প্রোগ্রামটি একই স্ট্রিংটিকে কেবল একই স্থানে রাখে এবং এটি পড়তে পারেন বা পড়ুন - ডেটা ন্যূনতম রাখে।
এছাড়াও আপনি যদি স্ট্রিং ব্যবহার করে কোনও dll কম্পাইল করেন constএফটিটি কনস্ট হিসাবে এবং কোনও কারণে স্ট্রিং.এম্পটি পরিবর্তন হয়, তবে সংকলিত dll আর একই রকম কাজ করবে না, কারণ cost
অভ্যন্তরীণ কোডটি স্ট্রিংয়ের অনুলিপি রাখার জন্য তৈরি করে প্রতিটি কল।
উদাহরণস্বরূপ এই কোডটি দেখুন:
public class OneName
{
const string cConst = "constant string";
static string cStatic = "static string";
readonly string cReadOnly = "read only string";
protected void Fun()
{
string cAddThemAll ;
cAddThemAll = cConst;
cAddThemAll = cStatic ;
cAddThemAll = cReadOnly;
}
}
সংকলক দ্বারা এ হিসাবে আসবে:
public class OneName
{
// note that the const exist also here !
private const string cConst = "constant string";
private readonly string cReadOnly;
private static string cStatic;
static OneName()
{
cStatic = "static string";
}
public OneName()
{
this.cReadOnly = "read only string";
}
protected void Fun()
{
string cAddThemAll ;
// look here, will replace the const string everywhere is finds it.
cAddThemAll = "constant string";
cAddThemAll = cStatic;
// but the read only will only get it from "one place".
cAddThemAll = this.cReadOnly;
}
}
এবং সমাবেশ আহ্বান
cAddThemAll = cConst;
0000003e mov eax,dword ptr ds:[09379C0Ch]
00000044 mov dword ptr [ebp-44h],eax
cAddThemAll = cStatic ;
00000047 mov eax,dword ptr ds:[094E8C44h]
0000004c mov dword ptr [ebp-44h],eax
cAddThemAll = cReadOnly;
0000004f mov eax,dword ptr [ebp-3Ch]
00000052 mov eax,dword ptr [eax+0000017Ch]
00000058 mov dword ptr [ebp-44h],eax
সম্পাদনা: সংশোধন করা টাইপ
এই উত্তরটি historicalতিহাসিক উদ্দেশ্যে রয়েছে।
মূলত:
কারণ String
একটি শ্রেণি এবং তাই ধ্রুবক হতে পারে না।
বর্ধিত আলোচনা:
এই উত্তরটি পরীক্ষা করার জন্য প্রচুর উপকারী ডায়ালগ তৈরি করা হয়েছিল এবং এটি মুছে ফেলার পরিবর্তে এই সামগ্রীটি সরাসরি পুনরুত্পাদন করা হয়:
.NET এ, (জাভা থেকে ভিন্ন) স্ট্রিং এবং স্ট্রিং ঠিক একই রকম। এবং হ্যাঁ, আপনি নেট থেকে আক্ষরিক ধ্রুবক থাকতে পারেন - ডাঃ জোকপু ফেব্রুয়ারী 3 '09 এ 16:57 এ
আপনি কি বলছেন যে কোনও শ্রেণীর ধ্রুবক থাকতে পারে না? - স্টিংজি জ্যাক 16 ফেব্রুয়ারী '09 এ 16:58 এ
হ্যাঁ, অবজেক্টগুলিকে কেবল পঠনযোগ্য ব্যবহার করতে হবে। কেবল স্ট্রাইকগুলি ধ্রুবকগুলি করতে পারে। আমি মনে করি আপনি যখন সংকলকটির
string
পরিবর্তে ব্যবহার করবেন তখনString
কনস্টটি আপনার জন্য কেবল পঠনযোগ্যতে পরিবর্তন করে। সি প্রোগ্রামারদের খুশি রাখার জন্য সমস্ত কিছুই। - গ্যারি শাটলার 3 ফেব্রুয়ারী '09 এ 16:59 এtvanfosson কেবল এটি আরও কিছুটা ভার্বোস ব্যাখ্যা করেছেন। "এক্স একটি ধ্রুবক হতে পারে না, কারণ এতে থাকা ওয়াই একটি শ্রেণি" ছিল সামান্য কিছুটা প্রসঙ্গ-মুক্ত;) - লিওনিডাস ফেব্রুয়ারী 3 '09 এ 17:01
স্ট্রিং.এম্পটি স্ট্যাটিক সম্পত্তি যা স্ট্রিং ক্লাসের উদাহরণ দেয়, খালি স্ট্রিং, নিজেই স্ট্রিং ক্লাস নয়। - tvanfosson ফেব্রুয়ারী 3 '09 এ 17:01
খালি স্ট্রিং ক্লাসের একটি পঠনযোগ্য উদাহরণ (এটি কোনও সম্পত্তি নয়)। - সেনফো 3 ফেব্রুয়ারী '09 এ 17:02 এ
মাথা ব্যথা করছে আমি এখনও মনে করি আমি সঠিক, তবে এখন আমি কম নিশ্চিত certain আজ রাতে গবেষণার প্রয়োজন! - গ্যারি শাটলার 3 ফেব্রুয়ারী '09 এ 17:07 এ
খালি স্ট্রিং স্ট্রিং ক্লাসের একটি উদাহরণ। খালি স্ট্রিং ক্লাসে একটি স্থির ক্ষেত্র (কোনও সম্পত্তি নয়, আমি সংশোধন করি)। মূলত একটি পয়েন্টার এবং জিনিসটি এটি নির্দেশ করে এমন জিনিসের মধ্যে পার্থক্য। যদি এটি কেবল পঠন না করা হয় তবে খালি ক্ষেত্রটি কোন উদাহরণটি উল্লেখ করে তা আমরা পরিবর্তন করতে পারতাম। - tvanfosson 3 ফেব্রুয়ারী '09 এ 17:07 এ
গ্যারি, আপনার কোনও গবেষণা করার দরকার নেই। চিন্তা করুন. স্ট্রিং একটি ক্লাস। খালি একটি স্ট্রিংয়ের উদাহরণ। - সেনফো ফেব্রুয়ারী 3 '09 17:12 এ
এমন কিছু আছে যা আমি পুরোপুরি পাই না: স্ট্রিং ক্লাসের স্থির নির্মাতা কীভাবে পৃথিবীতে স্ট্রিং ক্লাসের উদাহরণ তৈরি করতে পারেন? এটি কি কোনও ধরণের "মুরগী বা ডিম" দৃশ্য নয়? - ডাঃজোকপু 3 ফেব্রুয়ারী '09 এ 17:12 এ
এই উত্তরটি সিস্টেম.স্ট্রিং ছাড়া অন্য যে কোনও শ্রেণীর জন্য সঠিক হবে। .NET স্ট্রিংগুলির জন্য প্রচুর পারফরম্যান্স বিশেষ-কেসিং করে এবং এর মধ্যে একটি হ'ল আপনার স্ট্রিং ধ্রুবক থাকতে পারে, এটি চেষ্টা করে দেখুন। এই ক্ষেত্রে, জেফ ইয়েটসের সঠিক উত্তর রয়েছে। - জোয়েল মুয়েলার 3 ফেব্রুয়ারী '09 এ 19:25 এ
§7.18-এ বর্ণিত হিসাবে, ধ্রুবক-প্রকাশটি এমন একটি অভিব্যক্তি যা সংকলন-সময়ে সম্পূর্ণ মূল্যায়ন করা যায়। যেহেতু স্ট্রিং ব্যতীত অন্য কোনও রেফারেন্স-টাইপের নন-নাল মান তৈরি করার একমাত্র উপায় হ'ল নতুন অপারেটর প্রয়োগ করা এবং যেহেতু নতুন অপারেটরকে ধ্রুবক-অভিব্যক্তিতে অনুমতি দেওয়া হয় না, রেফারেন্স-ধরণের ধ্রুবকগুলির একমাত্র সম্ভাব্য মান স্ট্রিং ছাড়া অন্যটি শূন্য। পূর্ববর্তী দুটি মন্তব্যগুলি সরাসরি সি # ভাষার স্পেসিফিকেশন থেকে নেওয়া হয়েছিল এবং জোয়েল মুলার যা উল্লেখ করেছেন তার পুনরাবৃত্তি করেছিলেন। - সেনফো 4 ফেব্রুয়ারী '09 এ 15:05 5 এ