স্ট্রিং.এম্পটি বনাম নাল। আপনি কোনটি ব্যবহার করেন?


85

সম্প্রতি কাজের একজন সহকর্মী আমাকে বলেছিলেন যে string.Emptyস্ট্রিং ভেরিয়েবল সেট করার সময় ব্যবহার করবেন না nullতবে স্ট্যাকটিকে দূষিত করার সাথে ব্যবহার করবেন ?

তিনি বলেন না

string myString=string.Empty; তবে কর string mystring=null;

আসলেই কি এটা ব্যাপার? আমি জানি স্ট্রিং একটি অবজেক্ট তাই এটি সাজানোর মতো করে বোঝা যায়।

আমি জানি একটি নির্বোধ প্রশ্ন তবে আপনার দৃষ্টিভঙ্গি কী?


4
আমি কেন পুরোপুরি নিশ্চিত নই আপনি কেন করবেন ... উদাহরণ হিসাবে আপনি যে কোডটি নিয়ে আলোচনা করছেন সেটি কি কিছুটা আরও দিতে পারেন?
stusmith

কোনও কোড নেই I আমি আমার কলিগকে এমন কোনও জিনিসটি দেখতে চেয়েছিলাম যা আমি ডিবাগ করছি এবং তিনি একটি সাধারণ নিয়ম হিসাবে "স্ট্রিং ব্যবহার করেন না itmpty" স্ট্যাকের উপরে যাওয়ার সাথে সাথে এটি বাতিল করে দেয় ers ব্যক্তিগতভাবে আমি সবসময় স্ট্রিং ব্যবহার করেছি mpএফটি যেহেতু এটি বেরিয়ে আসার সময়টি "" না বলে সঠিকভাবে ব্যবহার করা উচিত ছিল।
ব্যবহারকারী 712923


আমার অর্থ হ'ল ... string.Empty, ""এবং nullসমস্ত ধ্রুবক মান, তবে এগুলি এতটাই 'সাধারণ' যে আমি কেন দেখতে পাচ্ছি না আপনি কেন একটি ভেরিয়েবলের জন্য নিযুক্ত করেছেন। আপনার যদি কোনও outভেরিয়েবল ক্যাপচার করতে হয় তবে কেবল ব্যবহার string myString;করবেন না কেন ?
stusmith

8
এই দিনগুলিতে পাঠ্যযোগ্যতা এবং শব্দার্থবিজ্ঞানের উপর মনোনিবেশ করা এবং অযৌক্তিক মাইক্রো-অপ্টিমাইজেশনের উপর দৃষ্টি নিবদ্ধ করা নয় এমন বিষয়গুলিতে যুক্তিগুলি দুর্বল, সেরা। আপনার প্রদত্ত প্রসঙ্গের জন্য যেকোন একটিতে সঠিক জিনিসটি ব্যবহার করুন। (উদাহরণস্বরূপ, যদি আপনি জানেন যে কারও মাঝের নাম নেই, তবে আপনি ব্যবহার করেন String.Empty; যদি আপনি জানেন না কারও মধ্যম নাম আপনি ব্যবহার করেন কিনা null)। তারপরে, একবার আপনার সঠিক অর্থ হয়ে গেলে, কোডটি এমনভাবে লিখুন যাতে স্পষ্টভাবে সঠিক এবং সহজেই বজায় থাকে।
জেসন

উত্তর:


111

nullএবং Emptyখুব আলাদা, এবং আমি তাদের মধ্যে নির্বিচারে স্যুইচ করার পরামর্শ দিই না। তবে উভয়ের কোনও অতিরিক্ত "ব্যয়" নেই, যেহেতু Emptyএকক স্থির রেফারেন্স (আপনি এটি যে কোনও সময় ব্যবহার করতে পারেন)।

এলডিএসএফএলডি দ্বারা সৃষ্ট স্ট্যাকের কোনও "দূষণ" নেই - এই উদ্বেগটি .... পাগল। একটি লোড nullকরা তর্কযোগ্যভাবে প্রান্তিকভাবে সস্তা, তবে যদি আপনি মানটি পরীক্ষা করার বিষয়ে সতর্ক না হন তবে নাল-রেফারেন্স ব্যতিক্রম ঘটতে পারে।

ব্যক্তিগতভাবে, আমি উভয়ই ব্যবহার করি না ... আমি যদি খালি স্ট্রিংটি ব্যবহার করি ""- সহজ এবং সুস্পষ্ট want মানে interning এই এছাড়াও কোন প্রতি-ব্যবহার ওভারহেড হয়েছে।


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


4
@ ব্যবহারকারী 7১২৯৩৩ যদি তিনি কোনও দৃ concrete় উদ্বেগ নিয়ে ফিরে আসেন তবে আমি তাদের শুনতে খুব পছন্দ করব
মার্ক গ্রাভেল

4
@Marc: ASAIK "" একটি বস্তু যেখানে string.Empty নয় সৃষ্টি .. পরীক্ষা এই এবং এই । এটি স্ট্রিং ইন্টার্ন পুলের সাথে কিছু করার আছে ....
জালাল


4
""ছয়গুণ দীর্ঘ আর বয়লারপ্লেট কোডের পরিবর্তে ব্যবহারের জন্য +1 । কে এই বাজে কথা বলছে ?! @ জালাল দ্যা ব্র্যাড আব্রামসের পোস্টিং গুরুতরভাবে পুরানো এবং যদি এখনও সংকলক সেই দুটি কোড একই করতে অপ্টিমাইজ করে না, তবে মাইক্রোসফ্টের জন্য লজ্জা! তবে তাদের কাজ ঠিক করা আমাদের কাজ নয়। এবং প্রকৃতপক্ষে, আমাদের দরকার নেই: দ্বিতীয় লিঙ্কে লাসে (মন্তব্যে) সমাবেশের ফলাফলগুলিকে উভয় রূপের সাথে তুলনা করার তুলনা করেছেন: সেগুলি অভিন্ন।
কনরাড রুডল্ফ

4
@ কনরাড: একটি উদাহরণ হ'ল যা ঘটছে যখন ধ্রুবক স্ট্রিংগুলি সংঘবদ্ধ করা হয়: স্ট্রিং ক্লাস ইন্টার্ন পুল ব্যবহার করে তাই আপনি যখন নতুন স্ট্রিং তৈরি করেন, ক্লাসটি পরীক্ষা করে থাকে যে স্ট্রিংটি ইতিমধ্যে পুলে রয়েছে এবং তারপরে যদি তা পুলটিতে যুক্ত না করা হয় .. এ কারণে যখন ""এটি পুরো পুলটি অনুসন্ধান করবে যখন এটি ইতিমধ্যে সেখানে আছে কিনা তা যাচাই string.Empty;করবে এবং এটি ব্যবহার করার সময় সেই পূর্বনির্ধারিত মানটি ব্যবহার করবে এবং অনুসন্ধানের আর অস্তিত্ব থাকবে না। বর্গ এই পদ্ধতি exposeed: string.Intern/IsInternedপরীক্ষা এই
জালাল সাঈদ

35

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

nullডেটার অনুপস্থিতি নির্দেশ করতে ব্যবহার করা উচিত, string.Empty(বা "") তথ্য উপস্থিতি নির্দেশ করতে, কিছু খালি পাঠ্য। কোনও সুনির্দিষ্ট কেস রয়েছে যেখানে আপনি নিশ্চিত নন যে কোনটি সবচেয়ে উপযুক্ত?

সম্পাদনা করুন, উদাহরণগুলি যুক্ত করুন:

  • আপনি string.Emptyকোনও ব্যক্তির নামের জন্য ডিফল্ট পোস্টফিক্স হিসাবে ব্যবহার করতে পারেন (বেশিরভাগ লোকের উদাহরণস্বরূপ পিএইচডি নেই)

  • আপনি nullএকটি কনফিগারেশন বিকল্পের জন্য ব্যবহার করতে পারেন যা কনফিগার ফাইলে নির্দিষ্ট করা হয়নি। এই ক্ষেত্রে, string.Emptyকনফিগার বিকল্পটি উপস্থিত থাকলে ব্যবহৃত হবে তবে পছন্দসই কনফিগার মানটি একটি খালি স্ট্রিং ছিল।


আমি কখনই সেভাবে ভাবি নি, আমাকে স্বীকার করতে হবে you আপনি যা বলেছিলেন তা উপহার দিয়েছিলেন, আপনি কি আমাকে একটি উদাহরণ দিতে পছন্দ করেন? আমি জানি আপনার ব্যাখ্যাটি স্বতঃস্ফূর্ত তবে এটি এখনও ... ধন্যবাদ
ব্যবহারকারী 712323

4
ঠিক আছে, এক বা অন্যটিকে বেছে নেওয়ার একমাত্র কারণ আপনি এটি যে জায়গাতে ব্যবহার করবেন তা নির্ভর করে। অর্থাত ব্যবহার করুন string.Emptyবা ""আপনি যখন খালি স্ট্রিং ব্যবহার করতে চান এবং nullযখন আপনি নির্দেশ করতে চান তখন কোনও ডেটা নেই। আপনি string.Emptyকোনও ব্যক্তির নামের জন্য ডিফল্ট পোস্টফিক্স হিসাবে ব্যবহার করতে পারেন (বেশিরভাগ লোকের উদাহরণস্বরূপ পিএইচডি নেই) - এবং nullএকটি কনফিগারেশন বিকল্পের জন্য যা কনফিগার ফাইলে নির্দিষ্ট করা হয়নি। দ্বিতীয় ক্ষেত্রে, string.Emptyকনফিগারেশন বিকল্প উপস্থিত থাকলে ব্যবহৃত হবে, তবে কাঙ্ক্ষিত কনফিগার মানটি একটি খালি স্ট্রিং ছিল।
কাইরেন জনস্টোন

@ কাইরেন জনস্টোন, যদি কারও কোনও পোস্টফিক্সের নাম না থাকে তবে null"নো পোস্টফিক্স" ইঙ্গিত করতে কেন ব্যবহার করবেন না ?
অফিরিড

8

অন্যরা ইতিমধ্যে উত্তর হিসাবে তারা পৃথক।

static void Main(string[] args)
{
    string s1 = null;
    string s2 = string.Empty;
    string s3 = "";
    Console.WriteLine(s1 == s2);
    Console.WriteLine(s1 == s3);
    Console.WriteLine(s2 == s3);
}

 results:
 false     - since null is different from string.empty
 false     - since null is different from ""
 true      - since "" is same as string.empty

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

স্ট্রিংগুলিকে কোনও ফাইল বা যোগাযোগের মধ্যে সংরক্ষণের উদ্দেশ্যে:
আপনি সম্ভবত স্ট্রিংটিকে বাইটে রূপান্তর করতে চান।
আমি প্রস্তাবিত একটি ভাল অনুশীলন হ'ল আপনার রূপান্তরিত স্ট্রিংয়ে শিরোনাম বাইটের 2 টি বিভাগ যুক্ত করা।

বিভাগ 1 - মেটা তথ্য যা 1 বাইটে সংরক্ষণ করা হয় এবং পরবর্তী বিভাগটির দৈর্ঘ্য বর্ণনা করে।

বিভাগ 2 - সংরক্ষণ করার জন্য স্ট্রিংয়ের দৈর্ঘ্য ধারণ করে।

উদাহরণ:
স্ট্রিং "abcd" - সরলকরণের জন্য আমি এএসসিআইআই এনকোডার ব্যবহার করে এটি রূপান্তর করব এবং {65,66,67,68} পাব}
গণনা সেগমেন্ট 2 4 প্রদান করবে - সুতরাং 4 বাইট রূপান্তরিত স্ট্রিংয়ের দৈর্ঘ্য।
গণনা সেগমেন্ট 1 1 প্রদান করবে - রূপান্তরিত স্ট্রিং তথ্যের দৈর্ঘ্য তথ্য ধরে রাখার জন্য যেমন 1 বাইট ব্যবহার করা হয়েছিল (যা 4 ছিল, অর্থাত যদি এটি 260 হত তবে আমি 2 পেয়ে যাব)

বাইটের নতুন স্ট্রাইপটি এখন {1,4,65,66,67,68 be হবে যা কোনও ফাইলে সংরক্ষণ করা যায়।

বিষয়টির ক্ষেত্রে সুবিধাটি হ'ল যদি আমার সংরক্ষণের জন্য একটি খালি স্ট্রিং থাকে তবে আমি 0 এর দৈর্ঘ্যের মধ্যে খালি বাইটগুলির বর্জন থেকে পাই এবং সেগমেন্টগুলি গণনা করার পরে আমার কাছে {1,0 having থাকবে যা হতে পারে সংরক্ষণ করা হয়েছে এবং পরে লোড করা হয়েছে এবং খালি স্ট্রিংয়ে ফিরে ব্যাখ্যা করা হবে। অন্যদিকে আমার স্ট্রিংয়ে যদি আমার নাল মান থাকে তবে আমি সংরক্ষণ করতে আমার বাইট অ্যারে হিসাবে কেবলমাত্র {0 having রেখে শেষ করব এবং আবার যখন লোড করা হয় তখন নাল থেকে ফিরে ব্যাখ্যা করা যায়।

আরও একাধিক সুবিধা রয়েছে যেমন আপনি একাধিক স্ট্রিং জ্যাগ করে তবে কী আকারটি লোড করতে হবে তা জেনে বা knowing

বিষয়টিতে ফিরে আসুন - এটি .. ঠিক একই ধরণের স্ট্যাকটিকে দূষিত করে যেমন বর্ণিত একই প্রিন্সিপালগুলি কোনও সিস্টেমের দ্বারা শূন্য থেকে শূন্যস্থানকে পৃথক করতে ব্যবহার করা হয় .. সুতরাং হ্যাঁ স্ট্রিং E এমপিটি নাল থেকে বেশি স্মৃতি গ্রহণ করে, যদিও আমি না করতাম এটিকে দূষণ বলুন .. এটি আরও 1 বাইট।


1

এটি মৃত্যুর জবাব দেওয়া হয়েছে, কিন্তু নাল অর্থ কোনও মূল্য নয়, আরম্ভ করা হয়নি। স্ট্রিং.এম্পটির অর্থ "" (একটি ফাঁকা স্ট্রিং) যেমনটি এমএসডিএন-তে উল্লিখিত রয়েছে।

একটি খালি বা নাল স্ট্রিংয়ের জন্য চেক করার সবচেয়ে নিরাপদ উপায়টি স্ট্রিং ব্যবহার করছে .IsNullOrEmpty।


-2

FWIW, আমি দেখেছি যে মিশ ""এবং String.Emptyকাজ করে না:

var a = "";
alert("a " + (a == "") + ", " + (a==String.Empty));   //Yields "a true, false"

var b = String.Empty;
alert("b " + (b == "") + ", " + (b == String.Empty)); //Yields "b false, true"

বিশেষত, আপনি যদি $.trimখালি ডিওএম ইনপুট ক্ষেত্রের মান পেতে ব্যবহার করেন তবে এর সাথে এটির তুলনা করুন String.Empty, আপনি পাবেন false। কেন তা নিশ্চিত নয়, তবে আপনি সেখানে যান। আমি এখন কেবল ""ধারাবাহিকতার জন্য সর্বত্র ব্যবহার করি ।


4
হ্যাঁ. এজন্য আমাদের সকলের চেক .Length==0বা ব্যবহার করার অভ্যাস থাকা উচিত.Compare()
zanlok

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