স্ট্রিং কেন? এম্পটি ধ্রুবক নয়?


188

ইন। নেট কেন স্ট্রিং.এম্পটি কেবল একটি ধ্রুবকটির পরিবর্তে পড়া হয়? আমি কেবল ভাবছি যে এই সিদ্ধান্তের পিছনে যুক্তিটি কী ছিল তা যদি কেউ জানে কিনা।


5
এই প্রশ্নটি এটিকে সমাধান করতে পারে, সংক্ষিপ্ত উত্তরটি, কেউ জানে না ...
জিডোরন মনিকা

হ্যাঁ, এরিক লিপার্টের প্রতিক্রিয়ার জন্য +1, ধন্যবাদ!
ট্র্যাভিস

বিশেষত দেওয়া হয়েছে যে ডেসিমাল.জিরো কনস্ট (ব্যবহারকারী দৃষ্টিকোণ থেকে ...)
হামিশ গ্রুবিজন

উত্তর:


147

মাইক্রোসফ্ট এখানে শেয়ার্ড সোর্স কমন ল্যাঙ্গুয়েজ ইনফ্রাস্ট্রাকচার ২.০ প্রকাশে ইঙ্গিত করে যেহেতু static readonlyপরিবর্তে ব্যবহার করা হয় সে কারণেই পরিচালনা না করা কোড ব্যবহার করা । ফাইলটি দেখতে হবে ।constsscli20\clr\src\bcl\system\string.cs

খালি ধ্রুবকটি খালি স্ট্রিংয়ের মান ধরে। আমাদের স্ট্রিং কনস্ট্রাক্টরকে কল করতে হবে যাতে সংকলকটি এটি আক্ষরিক হিসাবে চিহ্নিত না করে।

এটি আক্ষরিক হিসাবে চিহ্নিত করার অর্থ হ'ল এটি কোনও ক্ষেত্র হিসাবে প্রদর্শিত হবে না যা আমরা স্থানীয় থেকে অ্যাক্সেস করতে পারি।

এই সহজ নিবন্ধটি থেকে আমি কোডপ্রজেক্টে এই তথ্যটি পেয়েছি ।


আমি সত্যিই যদি এই মন্তব্য ব্যাখ্যা করতে পারেন (কারণ জন স্কিট না ... পারে) এখানে দেখতে কৃতজ্ঞ হবে: stackoverflow.com/questions/8462697/...
gdoron মনিকা সমর্থন করছে

2
@ জিডোরন: আমার অনুমান (এবং এটি অনুমান) এটি। যখন একটি মানকে আক্ষরিক (ধ্রুবক) হিসাবে সংজ্ঞায়িত করা হয় তখন এর মান যেখানে উল্লেখ করা হয় সেখানে সন্নিবেশ করা হয় যখন যখন এটি আক্ষরিক হিসাবে সংজ্ঞায়িত করা হয় না তখন মানটির উত্সটি উল্লেখ করা হয় এবং আসল মান রানটাইমে পুনরুদ্ধার করা হয়। আমি সন্দেহ করি যে পরবর্তীটি নিশ্চিত করতে পারে যে রানটাইমের সময় নেটিভ এবং .NET এর মধ্যে স্ট্রিংয়ের যথাযথ মার্শেলিং ঘটে - যদি এটি আক্ষরিক হয় তবে সম্ভবত দেশীয় সংকলকটি কোনওভাবে আক্ষরিক মানটিকে তার স্থানীয় কোডে টানতে হবে, সম্ভবত এটি নয় সম্ভাব্য. যদিও আমার পক্ষ থেকে এটি সব অনুমান করা যায়।
জেফ ইয়েটস

7
এর অর্থ এই যে কোনওটি স্ট্রিংয়ের পরিবর্তে "" ব্যবহার করতে হবে methods পদ্ধতিগুলিতে ডিফল্ট প্যারামিটার মানগুলির জন্য শক্তি। যা কিছুটা বিরক্তিকর।
নিকোডেমাস 13

17
স্ট্রিংয়ের সময় "" একটি ভুলের মতো দেখতে পারে mp এমপিটি ইচ্ছাকৃত ইচ্ছা দেখায়
ক্রিস্টোফার স্টিভেনসন

3
@ জেফইটস আমি যুক্ত করেছিলাম যে এটি ইতিবাচক নয় এটি ইতিমধ্যে বিরক্তিকর। লোকেরা বাকী কোডটি দেখতে পাবে এবং "স্ট্রিংয়ের পরিবর্তে তিনি এখানে" কেন ব্যবহার করছেন তা অবাক করবে mp আমি String.Emptyএকার জন্য আর ব্যবহার না করার জন্য গুরুত্ব সহকারে বিবেচনা করছি ।
জুলাইগলন

24

আমি এখানে অনেক বিভ্রান্তি এবং খারাপ প্রতিক্রিয়া আছে বলে মনে করি।

প্রথমত, constক্ষেত্রগুলি staticসদস্য ( উদাহরণ সদস্য নয় ) not

বিভাগের 10.4 সি # ভাষার স্পেসিফিকেশনের স্থিতি পরীক্ষা করুন।

ধ্রুবকগুলি স্থিতিশীল সদস্য হিসাবে বিবেচিত হলেও, একটি ধ্রুবক ঘোষণার জন্য কোনও স্ট্যাটিক সংশোধক প্রয়োজন হয় না বা অনুমতিও দেয় না।

তাহলে public constসদস্যদের স্ট্যাটিক হয়, এক বিবেচনা না করতে পারে যে একটি ধ্রুবক একটি নতুন অবজেক্ট তৈরি করবে।

এটি প্রদত্ত, নিম্নলিখিত কোডের লাইনগুলি একটি নতুন অবজেক্ট তৈরির ক্ষেত্রে ঠিক একই কাজ করে।

public static readonly string Empty = "";
public const string Empty = "";

মাইক্রোসফ্টের একটি নোট এখানে 2 এর মধ্যে পার্থক্য ব্যাখ্যা করে:

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

সুতরাং আমি দেখতে পাচ্ছি যে এখানে একমাত্র প্রশ্রয়জনক উত্তর হ'ল জেফ ইয়েটস।


কনস্ট্যান্ড এবং স্ট্যাটিক রিডোনলি সি-স্পিকে সম্পর্কিত ধরণের শব্দ এবং স্পষ্টতার জন্য +1।
জেফ ইয়েটস

17
এটি পুনরায় পড়ার পরে, আমি তাতে দ্বিমত পোষণ করছি const stringএবং static readonly stringএকই জিনিস করছি। কনস্ট মানগুলি সংযুক্ত কোডে প্রতিস্থাপিত হয় যেখানে স্থির পাঠযোগ্য মানগুলি উল্লেখ করা হয়। আপনার যদি constলাইব্রেরি এ-তে লাইব্রেরি বি ব্যবহার করা হয়, গ্রন্থাগার বি সেই constচলকের সমস্ত রেফারেন্সকে তার আক্ষরিক মানের সাথে প্রতিস্থাপন করবে ; static readonlyপরিবর্তে যদি সেই পরিবর্তনশীল হয় তবে এটি উল্লেখ করা হবে এবং রানটাইমের সময় তার মান নির্ধারণ করা হবে।
জেফ ইয়েটস

3
লাইব্রেরিগুলি উল্লেখ করার সময় জেফের বক্তব্যটি গুরুত্বপূর্ণ। আপনি যদি এটিকে পুনরায় কম্পাইল করে এবং পুনরায় বিতরণ করেন , বি কে পুনরায় সংবিধান না করে বি এখনও পুরানো মানগুলি ব্যবহার করবেন।
মার্ক সোওুল

4
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 

সম্পাদনা: সংশোধন করা টাইপ


সুতরাং, এর অর্থ হ'ল কনস্ট্রিং স্ট্রিংটি সর্বদা তড়িঘড়ি করে ক্লাসের সাথে থাকা কনস্টের সাথে থাকে? দেখে মনে হচ্ছে স্ট্যাটিক রিডোনলি ব্যবহার করা আরও ভাল।
দ্য রিপোর্টার

@ থাইবার্সকার ভাল, তবে আপনার ব্যবহারের সমস্ত বিকল্প রয়েছে।
এরিস্টস

> তারপরে সংকলিত dll আর একই রকম কাজ করবে না, কারণ ব্যয়টি প্রতিটি কলটিতে স্ট্রিংয়ের অনুলিপি রাখার জন্য অভ্যন্তরীণ কোড তৈরি করে। @ অ্যারিস্টস এটি একদম ঠিক নয়। একবার কোডটি সংকলিত হয়ে গেলে, স্ট্রিংয়ের "অনুলিপি" এক্সিকিউটেবলের টেক্সট ব্লকে উল্লেখ করা হবে এবং সমস্ত কোড কেবল মেমরির একই ব্লকটিকে উল্লেখ করবে reference আপনি আপনার দ্বিতীয় ধাপে যা উদ্ধৃত করেছেন তা কেবল একটি মধ্যবর্তী পদক্ষেপ।
পিটার ডলকেন্স

@ ব্যবহারকারী 1533523 নোটটির জন্য আপনাকে ধন্যবাদ - আমি এটি পরীক্ষা করার জন্য যখন কিছুটা সময় পাই তখন আমি একটি পরীক্ষা করব
অ্যারিস্টোস

কীভাবে আপনি এই সমাবেশ কোড পেয়েছেন? সি # সমাবেশে সংকলন করে না!
jv110

0

এই উত্তরটি 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 এ


দয়া করে সঠিক উত্তরটি দিয়ে দিন। আপনি যদি গোটো সংজ্ঞা, আপনি দেখতে পাবেন যে এটি স্ট্রিং ক্লাসে রয়েছে এবং এটি স্ট্রিংয়ের উদাহরণ। এটি লোয়ার কেস হিসাবে দেখায় তা হ'ল সংকলক যাদু।
গ্যারি শাটলার

আমি আপনাকে কে কমিয়ে দিয়েছি তা নয়, কিন্তু নেট, (জাভা থেকে ভিন্ন) স্ট্রিং এবং স্ট্রিং ঠিক একই। এবং হ্যাঁ, আপনি নেট থেকে স্ট্রিং
অক্ষর

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

7
আরও ভাল উত্তর আসার সাথে সাথে আমি এই উত্তরটি প্রায় মুছে ফেলেছি, তবে এই মন্তব্যে আলোচনাটি রাখা মূল্যবান।
গ্যারি শাটলার

1
@ গ্যারি, আপনি ভাগ্যবান আমি আপনার শেষ মন্তব্যটি পড়েছি, নইলে আমিও ডাউনটি করতাম। .NET- এ একটি স্ট্রিংয়ের একটি বিশেষ বৈশিষ্ট্য রয়েছে, এটি কোনও রেফ শ্রেণির ক্ষেত্রে এটি কোনও কনস্ট হতে পারে।
শিমি ওয়েটজ্যান্ডলার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.