স্ট্রিং.এম্পটি anচ্ছিক প্যারামিটারের জন্য একটি ডিফল্ট মান হিসাবে ব্যবহার করতে পারে না


89

আমি বিল ওয়াগনার দ্বারা কার্যকর সি # পড়ছি । ইন আইটেম 14 - ছোট করুন ডুপ্লিকেট সূচনা লজিক , তিনি নতুন ঐচ্ছিক প্যারামিটার একটি কন্সট্রাকটর বৈশিষ্ট্য ব্যবহারের নিম্নলিখিত উদাহরণে দেখায়:

public MyClass(int initialCount = 0, string name = "")

লক্ষ্য করুন যে তিনি তার ""পরিবর্তে ব্যবহার করেছেন string.Empty
তিনি মন্তব্য করেছেন:

আপনি [উপরের উদাহরণে] নোট করবেন যে দ্বিতীয় কনস্ট্রাক্টর আরও প্রথার পরিবর্তে নাম প্যারামিটারে ডিফল্ট মানটির জন্য "" নির্দিষ্ট করেছেন string.Empty। এটি কারণ string.Emptyএকটি সংকলন-সময় ধ্রুবক নয়। এটি স্ট্রিং ক্লাসে সংজ্ঞায়িত একটি স্ট্যাটিক সম্পত্তি। যেহেতু এটি একটি সংকলন ধ্রুবক নয়, আপনি এটি কোনও প্যারামিটারের জন্য ডিফল্ট মান হিসাবে ব্যবহার করতে পারবেন না।

আমরা string.Emptyযদি সব পরিস্থিতিতে স্থির ব্যবহার করতে না পারি , তবে তা কি এর উদ্দেশ্যকে পরাভূত করে না? আমি ভেবেছিলাম যে খালি স্ট্রিংয়ের উল্লেখ করার মতো আমাদের কাছে সিস্টেম-স্বতন্ত্র উপায় রয়েছে তা নিশ্চিত হয়ে আমরা এটি ব্যবহার করব। আমার বোঝা কি ভুল? ধন্যবাদ

আপডেট করুন
শুধু একটি ফলো আপ মন্তব্য। এমএসডিএন অনুসারে:

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

তারপরে আমরা হয় না ব্যবহার করতে সক্ষম নই System.Environment.NewLine, বা নতুন ইনস্ট্যান্টেটেড অবজেক্টগুলি ডিফল্ট মান হিসাবে ব্যবহার করতে পারি। আমি এখনও VS2010 ব্যবহার করি নি, এবং এটি হতাশাব্যঞ্জক!


4
খালি স্ট্রিংগুলি বিভিন্ন প্ল্যাটফর্মগুলিতে কীভাবে উপস্থাপন করা হয় তার মধ্যে আমি কোনও পার্থক্য সম্পর্কে অবগত নই। এটি নিউলাইনের মতো নয়।
টম কাবানস্কি

ঠিক আছে, আমি ভাবছিলাম যে, তাহলে এটি কি ঠিক কোডটি সুন্দর দেখাচ্ছে?
মাইকিগ 36

4
সিএলআর এবং 'সিস্টেম' নয় এটি নির্ধারক কারণ যা "" খালি স্ট্রিং কিনা। সুতরাং আমি মনে করি আপনি নিরাপদে ধরেই নিতে পারেন "" "একটি বাধ্যতামূলক সিএলআর প্রয়োগের স্ট্রিংয়ের প্রতি উল্লেখ করার একটি সিস্টেম-স্বতন্ত্র উপায়।
ক্রিস টেলর

"সিস্টেম-ইন্ডিপেন্ডেন্ট"? এর, সিস্টেম-নির্দিষ্ট "" এর বিপরীতে? (???)
কিওয়ার্টি

এমএসডিএন অনুসারে: এই ক্ষেত্রের মান শূন্য দৈর্ঘ্যের স্ট্রিং, ""। সুতরাং স্পষ্টতই প্ল্যাটফর্মের স্বাধীনতার সাথে এর কোনও যোগসূত্র নেই, কারণ অনেক লোক ইঙ্গিত করছে। তবুও এটি এখনও মনে হচ্ছে কেন এটি ব্যবহার করা উচিত লোকেরা সত্যই জানেন না!
মাইকিগ 36

উত্তর:


66

সি # 2.0 সংকলক হিসাবে, String.Emptyযাইহোক যাইহোক খুব সামান্য বিন্দু আছে , এবং আসলে অনেক ক্ষেত্রে এটি একটি হতাশার কারণ সংকলকটি কিছু রেফারেন্সগুলিকে ইনলাইন ""করতে পারে তবে এর সাথে একই করতে পারে না String.Empty

সি # 1.1 এ খালি স্ট্রিং সহ প্রচুর স্বতন্ত্র অবজেক্ট তৈরি করা এড়াতে দরকারী ছিল, তবে সেই দিনগুলি অতিক্রান্ত। ""ঠিক কাজ করে।


7
এমনকি নেট নেট 1.1 এ এটি স্বাধীন অবজেক্টগুলির "প্রচুর" তৈরি করবে না। আমি এই ক্ষেত্রে 1.1 এবং 2.0 এর মধ্যে পার্থক্যের বিশদটি মনে করতে পারি না, তবে এটি স্ট্রিং আক্ষরিক ইন্টার্নিংয়ের মাত্র ২.০ তে প্রবর্তিত হয়নি।
জন স্কিটি

স্পষ্টির জন্য ধন্যবাদ। আমার চারপাশে নজর ছিল এবং আমি সি # ২.০ এর পরিবর্তনের একটি ভাল সংক্ষিপ্তসার পাইনি, যদিও আমি নিশ্চিত যে আমি এর আগে একটি পড়েছি। আরও প্রযুক্তিগত তথ্যের কয়েকটি লিঙ্ক সহ আমি ২০০৮ সাল থেকে একটি স্ট্যাকওভারফ্লো উত্তর পেয়েছি। stackoverflow.com/questions/151472/…
অ্যান্ডি মর্টিমার

4
আমি এটি একটি সম্মতি জানাতে চাই, যদিও আমি স্ট্রিংয়ের খুব কম পয়েন্ট আছে তা বলা অপছন্দ করি E কার্যকর হিসাবে আমি এটি বেশ ভারী ব্যবহার করি। আমি এটি দেখতে দেখতে কেবল পরিষ্কার দেখছি, যদিও এটি আমার ব্যক্তিগত মতামত। অনেকগুলি জায়গায় স্ট্রিং রয়েছে। ইমপটি ব্যবহার করা যাবে না, এবং এই ক্ষেত্রে "" ব্যবহার করতে আমার কোনও সমস্যা নেই
xximjasonxx

15
আমি খুঁজে পেয়েছি যে স্ট্রিংয়ের সাথে খালি স্ট্রিংটি দ্রুত সনাক্ত করা খুব সহজ। যদিও ব্যাখ্যা জন্য +1।
নোটমে

11
+1 ক্রিস। এছাড়াও ভিএস-এ, আপনি "" ব্যবহারের ক্ষেত্রে সত্যই অনুসন্ধান করতে পারবেন না (স্ট্যান্ডার্ড ফাইন্ড করা ব্যতীত যা মন্তব্য এবং মার্কআপ সহ প্রতিটি পাঠ্য ম্যাচও ফিরিয়ে আনবে)। আপনি স্ট্রিং.এম্পটি সহ কোড নির্দিষ্ট ব্যবহারের জন্য একটি অনুসন্ধান করতে পারেন।
মিউট্যান্ট নিনজাকোডমুনকি

53

যদি আপনি সত্যিই এটি একটি yourচ্ছিক প্যারামিটার মান হিসাবে ব্যবহার করতে চান তবে খালি স্ট্রিংয়ের জন্য আপনার নিজের ধ্রুবককে সংজ্ঞায়িত করার কিছু নেই:

const string String_Empty = "";

public static void PrintString(string s = String_Empty)
{
    Console.WriteLine(s);
}

[একদিকে যেমন, সাধারণভাবে String.Emptyবেশি পছন্দ করার একটি কারণ "", যা অন্য উত্তরে উল্লেখ করা হয়নি, তা হ'ল বিভিন্ন ইউনিকোড অক্ষর (শূন্য প্রস্থের সংযোজক ইত্যাদি) খালি চোখে কার্যকরভাবে অদৃশ্য। সুতরাং এমন কিছু যা দেখে মনে ""হচ্ছে অগত্যা তা খালি স্ট্রিং নয়, তবে String.Emptyআপনি কী ব্যবহার করছেন তা ঠিক আপনার সাথেই রয়েছে । আমি বুঝতে পারি এটি বাগের সাধারণ উত্স নয়, তবে এটি সম্ভব]]


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

25

মূল প্রশ্ন থেকে:

আমি ভেবেছিলাম যে খালি স্ট্রিংয়ের উল্লেখ করার মতো আমাদের কাছে সিস্টেম-স্বতন্ত্র উপায় রয়েছে তা নিশ্চিত হয়ে আমরা এটি ব্যবহার করব।

কীভাবে ফাঁকা স্ট্রিং সিস্টেম থেকে সিস্টেমে পরিবর্তিত হতে পারে? এটি সর্বদা কোনও অক্ষরবিহীন একটি স্ট্রিং! আমি যদি এমন কোনও বাস্তবায়ন খুঁজে পেয়েছি যেখানে মিথ্যা ফিরেছে তবে আমি সত্যিই ভয় পেয়ে যাব string.Empty == "":) এটি এর মতো কিছু নয়Environment.NewLine

কাউন্টার টেররিস্টের অনুগ্রহ পোস্ট থেকে:

আমি স্ট্রিং চাই mpএমনটি পরবর্তী সি # প্রকাশে ডিফল্ট প্যারামিটার হিসাবে ব্যবহার করা যেতে পারে। : ডি

ভাল যে অবশ্যই ঘটবে না।

যদিও আমি ব্যক্তিগতভাবে খুব আলাদা ডিফল্ট মেকানিজমটি পছন্দ করতাম, sinceচ্ছিক প্যারামিটারগুলি যেভাবে শুরু হয়েছে সেই থেকে নেট শুরু করে and সাইট যদি কোনও সম্পর্কিত যুক্তি সরবরাহ করা হয় না।

সঙ্গে string.Emptyএটা সত্যিই অর্থহীন - ব্যবহার ""আপনি যা চান তা কি করতে হবে; এটা যে স্ট্রিং আক্ষরিক ব্যবহার করতে বেদনাদায়ক? (আমি আক্ষরিক সর্বত্র ব্যবহার করি - আমি কখনই ব্যবহার করি না string.Empty- তবে এটি ভিন্ন যুক্তি)

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

public void RecordTime(string message, DateTime? dateTime = null)
{
    var realDateTime = dateTime ?? DateTime.UtcNow;
}

... তবে এটি সর্বদা উপযুক্ত নয়।

উপসংহারে:

  • আমি খুব সন্দেহ করি যে এটি কখনই সি # এর অংশ হতে পারে
  • জন্য string.Emptyএটা অর্থহীন যাহাই হউক না কেন
  • জন্য অন্যান্য মান যা সত্যিই না সবসময় একই মান আছে, আসলেই পারেন একটি ব্যথা হতে

সমস্যাটি ঠিক করার এটি আসলে একটি ভাল উপায়। অন্যান্য ডিভাইস নির্ভরশীল ভেরিয়েবলগুলি বহন / সেট করতে একই জিনিস ব্যবহার করা যেতে পারে Environment.Newline.. আপনার উদাহরণ থেকে নিখোঁজ হওয়া একমাত্র জিনিসটি নালার জন্য চলকটির পরীক্ষা করা হবে এবং বিকাশকারীকে তাকে ব্যর্থতা ছুঁড়ে ফেলা হবে যে বলার অপেক্ষা রাখে না যে এটি অবিরাম হয়, গ্রহনযোগ্য না. if(dateTime == null){ throw new ArgumentException("The dateTime parameter must be set. Nullable type used for device independent variable set.");}বা এই জাতীয় কিছু। তবে আমি সত্যিই এটি পছন্দ করি! আপনার উপায় এটি করতে অন্য কোন সতর্কীকরণ?
ম্যাক্স ওভারড্রভ

@ ম্যাক্সওভার্ডআরভি: আপনি চান না যে এটি একটি ত্রুটি হয়ে যাওয়া বাতিল হবে - পুরো বিষয়টি হ'ল এটি যখন শূন্য হয় তখন আপনি একটি ডিফল্ট গণনা করেন। সাবধানবাণীটি হ'ল এটি নালকে নিজের মধ্যে একটি বৈধ মান হিসাবে অতিক্রম করার অনুমতি দেয় না।
জন স্কিটে

আপনি যে সম্পর্কে সম্পূর্ণরূপে সঠিক। আমার খারাপ। - এবং হ্যাঁ, একমাত্র সত্যিকারের সতর্কতাই হবে না ... এটি খুব খারাপ নয়। আবার: আমি এই সমাধানটি সত্যিই পছন্দ করি! :) এটি পোস্ট করার জন্য ধন্যবাদ! :)
ম্যাক্সওভারড্রভ

7

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


4
হতে পারে এটি বিভ্রান্তি প্রতিরোধ করে ""এবং " ", তবে আমি বলতে পারি না যে " "এটি সাধারণ।
গ্রেগ

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

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

4

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


4
আমি মনে করি আপনি সম্ভবত ঠিক বলেছেন যে বক্তব্যটি হ'ল কিছু লোক String.Emptyআরও পাঠযোগ্য consider । । ব্যক্তিগতভাবে যদিও, আমি মনে করি এটি কিছু বাদাম। ""সম্ভবত সবচেয়ে সাধারণ স্ট্রিংটি রয়েছে এবং প্রত্যেকে এটি এক বিলিয়ন বার দেখেছেন, তবে এটি কী অপঠনযোগ্য? String.Emptyপ্রায় হিসাবে দরকারী হিসাবে যদি একটি ছিল Int32.Zero
টিম গুডম্যান

3

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

public static readonly string Empty

প্রকৃত স্থির চেয়ে বরং এটি ব্যবহার করা যায় না।


2

আমি string.Emptyপঠনযোগ্যতার জন্য বিশুদ্ধভাবে ব্যবহার করি ।

যদি অন্য কাউকে আমার কোডটি পরে পড়তে / পরিবর্তন করতে হয় তবে তারা জানে যে আমি খালি স্ট্রিংয়ের জন্য কিছু পরীক্ষা করা বা সেট করতে চেয়েছিলাম। শুধু ব্যবহারের ""ফলে মাঝে মাঝে বাগ এবং বিভ্রান্তি ঘটতে পারে কারণ আমি সেখানে যে স্ট্রিংটি চেয়েছিলাম তা কেবল ভুলেই গিয়েছিলাম।

উদাহরণ স্বরূপ:

if(someString == string.Empty)
{

}

বনাম

if(someString == "")
{

}

প্রথম ifবিবৃতিটি আমার কাছে অনেক বেশি ইচ্ছাকৃত এবং পাঠযোগ্য বলে মনে হচ্ছে। যদিও এটি কেবল একটি অগ্রাধিকার, যদিও আমি সত্যিই এর ""পরিবর্তে ট্রেন-চুরমার দেখতে পাচ্ছি না string.Empty


-2

সম্ভবত এই সমস্যার সর্বোত্তম সমাধান হ'ল এই পদ্ধতিটির একটি ওভারলোড:

public static void PrintString() 
{ 
    PrintString(string.Empty);
}

4
কীভাবে উপরের প্রশ্নের উত্তর?
প্রণব সিং

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