স্ট্রিংয়ের বিন্দুটি কী mp কার্যকর সম্পত্তি


35

সম্পত্তি কেন string foo = string.Emptyছাত্রলীগের অন্তর্ভুক্ত ছিল ? এটি খালি স্ট্রিং ( string foo = "") ব্যবহার করার চেয়ে আরও ভার্জোজ এবং পরিষ্কার নয় বলে মনে হচ্ছে


6
নিতপিক: এটি ভাষার অংশ নয়। এটি ছাত্রলীগের একটি অংশ। ভিবি.এনইটি এবং এফ # এটি পাশাপাশি প্রতিটি অন্যান্য। নেট ভাষা ব্যবহার করতে পারে।
ওলেড

19
কারণ অন্যথায় আপনি খারাপ কাজগুলি করতে পারেন নি typeof(string).GetField("Empty").SetValue(null, " ");;)
ম্যাসন হুইলারের

1
@ ম্যাসনভিয়েল - প্রতিবিম্বের আনন্দ। প্রকৃত মন্দ জন্য, আপনার আত্মপরিচয় প্রয়োজন, তাই না?
ওডে

1
@ ম্যাসনভিয়েল, +১। ওহ godশ্বর, গগলস, তারা কিছুই করেন না!]
মাচাডো

1
@ ম্যাসনওহিলার এটি খাঁটি, পাতিত মন্দ evil আমি এটা ভালোবাসি. প্রশ্ন যদি আপনার আগ্রহী হয়: এটি কি এর চেয়ে বেশি নিরাপদ (এবং শালীনভাবে অভিনয় করা) হবে না public static string Empty { get { return string.Intern(""); } }?
জেসি সি স্লিকার 15

উত্তর:


55

আমি কেবল এখানে অনুমান করতে পারি:

string.Emptyবর্ণনাকারীদের জন্য সংজ্ঞায়িত করা হয়েছে - একটি স্ট্রিং শুরু করার সময়, এটি প্রসঙ্গটি থেকে স্পষ্ট নয় যে ""স্পষ্টভাবে ইনিশিয়ালাইজার হিসাবে বোঝানো হয়েছিল (পরিবর্তে nullবা বলা " "বা পরীক্ষার সময় স্থানধারক হিসাবে)। ব্যবহার string.Emptyএই ধরণের ধাঁধার একটি নির্দিষ্ট উত্তর।

এটি সি-তেও ফেলাব্যাক হতে পারে - সি এর ফাঁকা স্ট্রিং খালি স্ট্রিং নয়। এটি এমন একটি চরিত্রের অ্যারে যার প্রথম অক্ষর নাল (তাই খালি), যা সি # এর মতো নয়। আমার বক্তব্যটি হ'ল বিভিন্ন ভাষায় আপনি খালি স্ট্রিংকে বিভিন্ন উপায়ে উপস্থাপন করবেন (এবং তাদের বিভিন্ন অর্থ হতে পারে) - string.Emptyএরকম অস্পষ্টতাটির অবকাশ রয়েছে।

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


5
এখন পর্যন্ত একমাত্র সঠিক উত্তর হওয়ার জন্য +1।
PSr

কিছু কিছু ভাষায় এমনকি নাও হতে পারে আছে একটি খালি স্ট্রিং আক্ষরিক। স্পষ্টতই, স্ট্যান্ডার্ড পাস্কাল তা করেনি।
dan04

2
"সি-তে একটি খালি স্ট্রিং একটি খালি স্ট্রিং নয়" - তবে এখনও, আপনি লিখলে ""আপনি পাবেন {'\0'}, তাই খালি স্ট্রিং আক্ষরিক এবং এটি সংজ্ঞায়নের অন্য কোনও রাউন্ড আউট পদ্ধতির মধ্যে কোনও পার্থক্য থাকবে না।
বিশদভাবে

14

আমি যে উত্সগুলি শিখেছি সেগুলি সম্পর্কে আমি 100% নিশ্চিত নই তবে এটি ব্যবহারের জন্য কয়েকটি পয়েন্টের মধ্যে রয়েছে:

  • .NET সমাবেশে প্রতিটি স্ট্রিং অনন্য, তাই থাকার

    string foo = "";
    string bar = "";

    স্ট্রিং অপরিবর্তনীয় হওয়ায় আউটপুট অ্যাসেমব্লিতে 2 টি স্ট্রিংয়ের ফলাফল। উভয় রেফারেন্স থাকলে string.Emptyসমাবেশের আকার হ্রাস পায়।

  • Explicitness। আপনি যখন string.Emptyঅভিপ্রায়টি আসেন তখন পরিষ্কার হয়ে যায় যে এটি খালি স্ট্রিং বলে মনে করা হচ্ছে। তবে আপনি যদি পুরোটা জুড়ে এসে উপস্থিত হন foo = ""তবে প্রোগ্রামার পরীক্ষার সময় স্ট্রিংয়ের বিষয়বস্তুগুলি সরিয়ে ফেলে এবং এটি আবার যুক্ত করতে ভুলে গিয়েছিল, বা এটি কি সেভাবেই অনুমিত হয়?

1
স্মৃতিতে দুটি অভিন্ন স্ট্রিং রাখার পক্ষে এটি একটি বিজোড় আচরণ বলে মনে হবে। আসলে কি তা করা হয়?
রিগ

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

9
@ ডেলান একেবারে ঠিক আছে। ""/ string.Emptyইন্টার্ন করা হয় এবং শুধুমাত্র একটি অবজেক্ট তৈরি করা হবে।
ওডে

11
@Andy - সমস্ত স্ট্রিং লিটারেল .NET অন্তরীণ করা হয়। না সব স্ট্রিং। প্রোগ্রামগতভাবে তৈরি স্ট্রিংগুলি ডিফল্টরূপে ইন্টার্ন হয় না। এমএসডিএন-স্ট্রিং.ইন্টার্ন দেখুন ।
ওডে

3
@ ওজেড এট আলিয়া: আসলে আপনারা কেউই ঠিক সঠিক নন। প্রথমত, লিটারেল অন্তরীণ করা হয় একটি সমাবেশ মধ্যে কিন্তু অগত্যা সমাহারগুলি জুড়ে । দ্বিতীয়ত, সমাবেশগুলি জুড়ে খালি স্ট্রিংটি অভ্যন্তরীণ করা বা না করা একটি বাস্তবায়নের বিশদ; সিএলআর এর কিছু সংস্করণ করে এবং কিছু না করে। এই সত্যটি সম্পর্কে আমার নিবন্ধের একটি লিঙ্ক রয়েছে অন্য উত্তরের একটিতে; বিশদ জন্য এটি দেখুন।
এরিক লিপার্ট

2

কোন বস্তুর জন্য তৈরি করা হবে না string.Empty। ব্যবহার ""করা এমন একটি অবজেক্ট তৈরি করবে যা সম্ভবত স্ট্রিং ইন্টার্ন পুল থেকে আসে।

অতীতে, লোকেরা পরীক্ষা চালিয়েছিল এবং String.Emptyকিছুটা দ্রুত বেরিয়ে এসেছিল, তবে এটি একটি মাইক্রো-অপ্টিমাইজেশন।

স্ট্রিং.এম্পটিটি হ'ল:

//The Empty constant holds the empty string value.   
//We need to call the String constructor so that the compiler doesn't mark 
//this as a literal.   
//Marking this as a literal would mean that it doesn't show up as a field 
//which we can access from native.  
public static readonly String Empty = ""; 

2
তাহলে আপনার কথাটি ...?

1
বিন্দুটি স্ট্রিং E এমপিটি মূলত "" এর জন্য ধ্রুবক। আরও গভীর অর্থের জন্য স্ট্রিং.এস এর লেখক সন্ধান করুন। :)
জন রেয়নর

0

এটি মেমরির ব্যবহারের অনুকূলকরণ এবং স্ট্রিং তুলনার একটি অপ্টিমাইজেশনের বিষয়। যতবার আপনি আপনার অ্যাপ্লিকেশনটিতে খালি স্ট্রিং ব্যবহার করছেন, আপনি 0 টি অক্ষরযুক্ত একটি স্ট্রিং অবজেক্ট বরাদ্দ করছেন। স্ট্রিং তুলনা হিসাবে এটি চরিত্র অনুসারে অক্ষরের পরিবর্তে রেফারেন্স (পয়েন্টার) তুলনা করে করা যেতে পারে, যা খালি স্ট্রিংয়ের জন্যও দ্রুত।

আপনি যদি নিজের অ্যাপ্লিকেশনটিতে একই স্ট্রিংটি বহুবার ব্যবহার করেন তবে আপনি স্ট্রিং.ইন্টার্ন () কে স্ট্রিং দিয়ে কল করে একই ধরণের প্রক্রিয়াটি ব্যবহার করতে পারেন। তবে আপনি যদি প্রতিটি স্ট্রিং কেবল একবার ব্যবহার করে থাকেন তবে আপনি কেবল আরও মেমরি ব্যবহার করবেন।

সুতরাং স্ট্রিং.এম্পটিটি একটি বিশেষ কেস অপটিমাইজেশন যা বেশিরভাগ নেট অ্যাপ্লিকেশনগুলির জন্য করণীয়, এজন্য এটি ছাত্রলীগে সংহত করা হয়েছিল।

এই বিষয়ে আরও তথ্যের জন্য আমি এরিক লিপার্টের ব্লগ পোস্টটি দৃ reading ়তার সাথে পড়ার পরামর্শ দিচ্ছি ।

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


4
কেবলমাত্র লিঙ্কের উত্তরগুলি ভাল উত্তর দেয় না। এরিক যদি কখনও তার ব্লগ পুনর্গঠন করে তবে এই উত্তরটি অকেজো হয়ে যাবে। দয়া করে পোস্টটি এখানে সংক্ষিপ্ত করে রাখুন যাতে আমাদের কাছে সমস্ত তথ্য হস্তান্তরিত হয়।
ChrisF

7
@ ক্রিসএফ: আমি কখনই ব্লগটি পুনর্গঠন করতে পারি না। এটি একটি ব্রেকিং পরিবর্তন হবে এবং আপনি জানেন যে আমি তাদের সম্পর্কে কেমন অনুভব করি।
এরিক লিপার্ট

1
@ এরিকলিপার্ট - আমি বুঝতে পেরেছি যে আপনি কখনই তা করেন নি, তবে কেবল লিঙ্কের উত্তরগুলি ভাল উত্তর নয় এবং আমাদের এটি উপলব্ধি করতে লোকদের উত্সাহ দেওয়া দরকার।
ক্রিসএফ

3
@ এরিকলিপার্ট এটি কেবলমাত্র সংক্ষিপ্ত লিঙ্কগুলি সম্পর্কে নয়। এটি এখানে পাঠকদের কাছে ভদ্রতার বিষয়েও রয়েছে, সরাসরি উত্তরে কমপক্ষে পর্যাপ্ত সামগ্রী থাকা উচিত যাতে পাঠকরা লিঙ্কটি অনুসরণ করবেন কিনা সে সম্পর্কে একটি মতামত তৈরি করতে পারে। এবং উত্তরটি SE এর একটি অফলাইন অনুলিপিতেও বোঝা উচিত।
গিলস 21:
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.