খালি স্ট্রিংয়ের পরিবর্তে স্ট্রিং টাইপের ডিফল্ট মানটি কেন নাল?


218

nullআমি নিরাপদ ToUpper(), StartWith()ইত্যাদির মতো পদ্ধতিগুলি নিরাপদে প্রয়োগ করার আগে এটির জন্য আমার সমস্ত স্ট্রিং পরীক্ষা করা বেশ বিরক্তিকর

এর ডিফল্ট মানটি যদি stringখালি স্ট্রিং হয়, তবে আমাকে পরীক্ষা করতে হবে না এবং আমি এটি অন্য মানের মতো intবা doubleউদাহরণের সাথে আরও সুসংগত বলে মনে করব । অতিরিক্তভাবে Nullable<String>জ্ঞান হবে।

তাহলে কেন সি # এর ডিজাইনার nullস্ট্রিংয়ের ডিফল্ট মান হিসাবে ব্যবহার করতে বেছে নিয়েছেন?

দ্রষ্টব্য: এটি এই প্রশ্নের সাথে সম্পর্কিত তবে এটির সাথে কী করা উচিত তার পরিবর্তে কেন এটি বেশি মনোযোগী।


53
আপনি কি অন্যান্য রেফারেন্স ধরণের জন্য এই সমস্যাটিকে বিবেচনা করেন ?
জন স্কিটি

17
@ জনস্কিট নং, তবে কেবলমাত্র আমি প্রথমদিকে, ভুলভাবে ভেবেছিলাম যে স্ট্রিংগুলি মান ধরণের।
মার্সেল

21
@ মার্সেল: এটি সম্পর্কে অবাক হওয়ার জন্য এটি বেশ ভাল কারণ।
টিজে ক্রাউডার

7
@ জোনস্কিট হ্যাঁ হ্যাঁ. (তবে আপনি নন-অযোগ্য রেফারেন্স ধরণের আলোচনার জন্য কোনও অচেনা মানুষ ...)
কনরাড রুডল্ফ

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

উত্তর:


312

খালি স্ট্রিংয়ের পরিবর্তে স্ট্রিং টাইপের ডিফল্ট মানটি কেন নাল?

কারণ stringএকটি রেফারেন্স টাইপ এবং সমস্ত রেফারেন্স ধরণের জন্য ডিফল্ট মান null

টুপার (), স্টার্টওয়থ () ইত্যাদির মতো পদ্ধতিগুলি নিরাপদে প্রয়োগ করতে পারার আগে নালার জন্য আমার সমস্ত স্ট্রিং পরীক্ষা করা বেশ বিরক্তিকর ...

এটি রেফারেন্স ধরণের আচরণের সাথে সামঞ্জস্যপূর্ণ। উদাহরণস্বরূপ সদস্যদের আহ্বান করার আগে, একটি নাল রেফারেন্সের জন্য একটি চেক করা উচিত।

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

ডিফল্ট মান নির্দিষ্ট নির্দিষ্ট রেফারেন্স টাইপ ছাড়া অন্য nullকোনও ক্ষেত্রে এটি অসঙ্গত করে তোলে ।

অতিরিক্তভাবে Nullable<String>জ্ঞান হবে।

Nullable<T>মান ধরণের সঙ্গে কাজ করে। লক্ষণীয় বিষয়টি Nullableআসল। নেট প্ল্যাটফর্মে প্রবর্তিত হয়নি তাই তারা যদি এই নিয়মটি পরিবর্তন করে থাকে তবে অনেকগুলি ভাঙা কোড থাকতে পারে (( সৌজন্যে @ জকোলেব্রান্ড )


10
@ হেনকহোলটারম্যান একটি সম্পূর্ণ টন জিনিস বাস্তবায়ন করতে পারে, তবে কেন এইরকম চমকপ্রদ অসংলগ্নতা প্রবর্তন করবেন?

4
@ ডেলান - এখানে "কেন" প্রশ্ন ছিল।
হেন্ক হলটারম্যান

8
@ হেনকহোল্টারম্যান এবং "ধারাবাহিকতা" আপনার পয়েন্টটির প্রত্যাখ্যান "স্ট্রিংকে অন্যান্য রেফারেন্সের ধরণের তুলনায় আচরণ করা যেতে পারে"।

6
@ ডেলান: এমন একটি ভাষা নিয়ে কাজ করা যা স্ট্রিংকে মানের ধরণের হিসাবে বিবেচনা করে এবং ডটনেটে 2+ বছর ধরে কাজ করে, আমি হেনকের সাথে একমত agree আমি এটি ডটনেটে একটি বড় FLAW হিসাবে দেখছি ।
ফ্যাব্রিকিও আরাউজো

1
@ ডেলানান: যে কোনও মূল্যের ধরণ তৈরি করতে পারে যা মূলত String(১) ব্যবহারযোগ্য ডিফল্ট মান রাখার মান-টাইপ-ইশ আচরণ ব্যতীত এবং (২) যে কোনও সময় বক্সিং ইন্ডিয়ারেশনের দুর্ভাগ্যজনক অতিরিক্ত স্তর প্রয়োগ করা হয়েছিল any Object। প্রদত্ত যে stringboxing ষ্ঠ উপস্থানের প্রতিনিধিত্ব অনন্য, অতিরিক্ত বক্সিং এড়াতে বিশেষ চিকিত্সা করা খুব বেশি পরিমাণে হত না (আসলে, অ-ডিফল্ট বক্সিং আচরণগুলি নির্দিষ্ট করতে সক্ষম হওয়া অন্য ধরণের ক্ষেত্রেও ভাল জিনিস হবে)।
সুপারক্যাট

40

হাবিব ঠিক বলেছেন - কারণ stringএটি একটি রেফারেন্স টাইপ।

কিন্তু আরো গুরুত্বপূর্ণ, আপনি না পরীক্ষা করতে হবে nullপ্রতিটি সময় আপনি এটি ব্যবহার। ArgumentNullExceptionযদি কেউ আপনার ফাংশনটি পাস করে তবে আপনার সম্ভবত একটি নিক্ষেপ করা উচিতnullযদিও রেফারেন্স ।

এই জিনিসটি এখানে - ফ্রেমওয়ার্কটি NullReferenceExceptionযাইহোক আপনার জন্য একটি স্ট্রোক করবে যদি আপনি কোনও .ToUpper()স্ট্রিংয়ে কল করার চেষ্টা করেন । মনে রাখবেন যে nullপ্যারামিটারগুলি মূল্যায়ন করতে পারে বলে আপনার কার্যক্রমে কোনও বস্তুতে কোনও সম্পত্তি বা পদ্ধতি যেহেতু পাস করার জন্য আপনার যুক্তিগুলি পরীক্ষা করলেও এই কেসটি এখনও ঘটতে পারেnull

বলা হচ্ছে, খালি স্ট্রিং বা নালগুলির জন্য পরীক্ষা করা একটি সাধারণ জিনিস, তাই তারা সরবরাহ করে String.IsNullOrEmpty()এবং String.IsNullOrWhiteSpace()কেবল এই উদ্দেশ্যে।


30
আপনার কখনই নিক্ষেপ করা উচিত নয় NullReferenceException নিজেকে ( এমএসডিএন.মাইক্রোসফটকম /en-us/library/ms173163.aspx ); ArgumentNullExceptionআপনার পদ্ধতি নাল রেফ গ্রহণ করতে না পারলে আপনি একটি নিক্ষেপ করুন । এছাড়াও, যখন আপনি সমস্যাগুলি স্থির করছেন তখন নুলারফগুলি সাধারণত ডায়াগনোসিসের অন্যতম কঠিন ব্যতিক্রম, সুতরাং আমি নালীর জন্য যাচাই না করার পরামর্শটি খুব ভাল বলে মনে করি না।
অ্যান্ডি

3
@ অ্যান্ডি "নুলারফের সাধারণত নির্ণয় করা সবচেয়ে কঠিন ব্যতিক্রমগুলির মধ্যে একটি" আমি দৃ strongly়ভাবে একমত নই, আপনি যদি স্টাফ লগ করেন তবে এটি সন্ধান করা এবং ঠিক করা সত্যিই সহজ (কেবল নালার কেসটি পরিচালনা করবেন)।
লুই কোটম্যান

6
নিক্ষেপ ArgumentNullException প্যারামিটার নাম প্রদান করতে সক্ষম হচ্ছে বাড়তি সুবিধা হয়েছে। ডিবাগিংয়ের সময়, এটি ... ভুল, সেকেন্ড পরে সংরক্ষণ করে। তবে গুরুত্বপূর্ণ সেকেন্ড।
কোস

2
আপনি IsNullOrWhitespace খুব অন্তর্ভুক্ত করতে চাইতে পারেন @DaveMarkle msdn.microsoft.com/en-us/library/...
নাথন Koop

1
আমি সত্যই মনে করি সর্বত্র নালীর জন্য পরীক্ষা করা প্রচুর কোড ব্লাটের একটি উত্স। এটি কুৎসিত, এবং এটি হ্যাকি লাগছে এবং ধারাবাহিকভাবে থাকা কঠিন। আমি মনে করি (কমপক্ষে সি #-মত ভাষায়) একটি ভাল নিয়ম হ'ল "উত্পাদন কোডের নাল কীওয়ার্ডটি নিষিদ্ধ করুন, পরীক্ষার কোডে এটি পাগলের মতো ব্যবহার করুন"।
সারা

24

আপনি একটি এক্সটেনশন পদ্ধতি লিখতে পারেন (এটির জন্য মূল্য কী):

public static string EmptyNull(this string str)
{
    return str ?? "";
}

এখন এটি নিরাপদে কাজ করে:

string str = null;
string upper = str.EmptyNull().ToUpper();

100
কিন্তু দয়া করে না। আরেকটি প্রোগ্রামার সর্বশেষ জিনিসটি দেখতে চায় code হাজার হাজার লাইন কোডটি পেপার্ড করে দেওয়া হয় mp এমপিটিহুল () সর্বত্রই কেবল ব্যতিক্রমের কারণে "ভয় পেয়েছিল" কারণ সর্বত্র everywhere
ডেভ মার্কল

15
@ ডেভমার্কল: তবে স্পষ্টতই এটি ওপি খুঁজছিল। "টুপার (), স্টার্টওয়থ () ইত্যাদির মতো নিরাপদে পদ্ধতি প্রয়োগ করার আগে আমার সমস্ত স্ট্রিংগুলি নালার জন্য পরীক্ষা করা বেশ বিরক্তিকর"
টিম শেমলেটার

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

5
@ অ্যান্ডি: সঠিক নাল চেক না করানোর সমাধান হ'ল নালগুলি সঠিকভাবে পরীক্ষা করা, কোনও সমস্যার জন্য ব্যান্ড-সহায়তা না দেওয়া।
ডেভ মার্কেল

7
আপনি যদি লেখার ঝামেলার মধ্য দিয়ে যাচ্ছেন তবে যেখানে এটি প্রয়োজন সেখানে .EmptyNull()কেবল কেন ব্যবহার করবেন (str ?? "")না? এটি বলেছিল, @ ডেভমার্কলের মন্তব্যে প্রকাশিত অনুভূতির সাথে আমি একমত: আপনার সম্ভবত এমন হওয়া উচিত নয়। nullএবং String.Emptyধারণাগতভাবে পৃথক, এবং আপনি অগত্যা একজনের সাথে অন্যের মতো আচরণ করতে পারবেন না।
একটি সিভিএন

17

আপনি সি # 6.0 হিসাবে নিম্নলিখিতগুলিও ব্যবহার করতে পারেন

string myString = null;
string result = myString?.ToUpper();

স্ট্রিং ফলাফল নাল হবে।


1
সঠিক হতে, সি # 6.0 সাল থেকে, এটি একটি ভাষা বৈশিষ্ট্য হওয়ায় আইডিইর সংস্করণটির সাথে কিছুই করার নেই।
স্টিজন ভ্যান অ্যান্টওয়ার্পেন

3
অন্য বিকল্প -public string Name { get; set; } = string.Empty;
জাজা হ্যারিস

এটাকে কি বলে? ? myString .ToUpper ();
হান্টার নেলসন

1
একে নাল-কন্ডিশনাল অপারেটর বলা হয়। আপনি এখানে এটি সম্পর্কে পড়তে পারেন msdn.microsoft.com/en-us/magazine/dn802602.aspx
russelrillema

14

খালি স্ট্রিং এবং নালগুলি মূলত পৃথক। একটি নাল একটি মানের অনুপস্থিতি এবং একটি খালি স্ট্রিং একটি মান যা খালি।

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

এছাড়াও, যদি আপনি সেই স্ট্রিং ভেরিয়েবলটিকে অ্যাপ্লিকেশনের অন্যান্য অংশে পাস করেন, তবে সেই কোডটির আপনি যাচাই করে একটি ফাঁকা মান পাস করেছেন বা আপনি সেই ভেরিয়েবলের মানটি বসানো ভুলে গেছেন কিনা তা যাচাই করার কোনও উপায় থাকবে না।

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

সংক্ষেপে, একক রাষ্ট্রের জন্য কেবল 1 টি প্রতিনিধিত্ব থাকা সর্বদা ভাল। খালি এবং নালগুলি সম্পর্কে বিস্তৃত আলোচনার জন্য নীচের লিঙ্কগুলি দেখুন।

/software/32578/sql-empty-string-vs-null-value

ব্যবহারকারীর ইনপুট নিয়ে কাজ করার সময় NULL বনাম খালি


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

1
আপনি যখন এটি কোনও পাঠ্য বাক্সের সাথে ব্যবহার করেন তখন খুব বেশি পার্থক্য হয় না। যে কোনও উপায়ে, একটি স্ট্রিংয়ের মান অনুপস্থিতি উপস্থাপনের জন্য একটি স্বরলিপি থাকা সর্বসম্মত। যদি আমাকে একটি বাছাই করতে হয়, আমি শূন্য বাছাই করব।
নার্ভ

ডেলফিতে, স্ট্রিং একটি মান ধরণের এবং তাই নਾਲ হতে পারে না। এটি জীবনকে এই ক্ষেত্রে অনেক সহজ করে তোলে - আমি সত্যিই খুব বিরক্তিকর মেকিং স্ট্রিংটিকে একটি রেফারেন্স টাইপ পাই।
ফ্যাব্রিকিও আরাউজো

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

7

মূল কারণ / সমস্যা হ'ল সিএলএস স্পেসিফিকেশনের ডিজাইনাররা (যেটি ভাষা কীভাবে নেট ব্যবহার করে তা সংজ্ঞায়িত করে) এমন কোনও উপায় নির্দিষ্ট করে না যার মাধ্যমে শ্রেণীর সদস্যরা নির্দিষ্ট callvirtকরে ডাকারকে ছাড়াই সরাসরি ডাকতে হবে বলে উল্লেখ করতে পারে নাল-রেফারেন্স চেক; বা এটি কোনও কাঠামো নির্ধারণের অর্থ প্রদান করে নি যা "স্বাভাবিক" বক্সিংয়ের সাপেক্ষে নয়।

সিএলএসের স্পেসিফিকেশনটি যদি কোনও উপায় সংজ্ঞায়িত করে, তবে। নেট পক্ষে কমন অবজেক্ট মডেল (সিওএম) দ্বারা প্রতিষ্ঠিত নেতৃত্বকে ধারাবাহিকভাবে অনুসরণ করা সম্ভব হত, যার অধীনে নাল স্ট্রিংয়ের রেফারেন্স শব্দার্থগতভাবে একটি খালি স্ট্রিংয়ের সমতুল্য হিসাবে বিবেচিত হত এবং অন্যটির জন্য ব্যবহারকারী-সংজ্ঞায়িত অপরিবর্তনীয় শ্রেণীর ধরণের যা মান শব্দার্থবিজ্ঞান একইভাবে ডিফল্ট মানগুলি সংজ্ঞায়িত করতে পারে বলে মনে করা হয়। মূলত, কি ঘটতে প্রতিটি সদস্য হতে হতো String, যেমন Lengthভালো কিছু হিসেবে লেখা হবে [InvokableOnNull()] int String Length { get { if (this==null) return 0; else return _Length;} }। এই পদ্ধতির জন্য মূল্যগুলির মতো আচরণ করা উচিত এমন জিনিসগুলির জন্য খুব সুন্দর শব্দার্থবিজ্ঞানের প্রস্তাব দেওয়া হত তবে বাস্তবায়নের কারণে সমস্যাগুলির গাদাতে রাখা দরকার need এই পদ্ধতির সাথে সবচেয়ে বড় অসুবিধা হ'ল এই ধরণের এবং এর মধ্যে রূপান্তরটির শব্দার্থক শব্দObject শব্দগুলি কিছুটা দুর্বল হতে পারে।

একটি বিকল্প পদ্ধতির বিশেষ কাঠামোগত ধরণের সংজ্ঞা দেওয়া যা তাদের উত্তরাধিকার সূত্রে প্রাপ্ত হয় নি Objectতবে তার পরিবর্তে কাস্টম বক্সিং এবং আনবক্সিং অপারেশন ছিল (যা অন্য কোনও শ্রেণীর ধরণের / থেকে রূপান্তরিত হবে)। এই ধরণের পদ্ধতির অধীনে, একটি শ্রেণীর ধরণ থাকবে NullableStringযা স্ট্রিং এখনকার মতো আচরণ করে এবং একটি কাস্টম-বক্সযুক্ত স্ট্রাক্ট প্রকার String, যা একক ব্যক্তিগত Valueপ্রকারের ব্যক্তিগত ক্ষেত্র ধারণ করবে String। এটিকে রূপান্তর করার চেষ্টা করা Stringহচ্ছে NullableStringবা শূন্য হলে, বা যদি নাল হয় Objectতবে ফিরে আসবে । কাস্ট করার চেষ্টা করা হচ্ছে , কোনও উদাহরণের একটি নন-নাল রেফারেন্সটি রেফারেন্সটি এতে সংরক্ষণ করবেValueString.EmptyStringNullableStringValue সংরক্ষণ করবে (সম্ভবত দৈর্ঘ্য শূন্য হলে নাল সংরক্ষণ করা হবে); অন্য কোনও রেফারেন্স ingালাই একটি ব্যতিক্রম ছুঁড়ে ফেলবে।

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


1
যে কেউ এসকিউএল-তে অনেক বেশি কাজ করে এবং ওরাকেলের মাথা ব্যথার সাথে NUL এবং শূন্য-দৈর্ঘ্যের মধ্যে পার্থক্য তৈরি না করে তার মুখোমুখি হয়ে কথা বলার সময় আমি খুব আনন্দিত যে নেট । "খালি" একটি মান, "নাল" নয়।

@ জোনফএল ট্রেডস: আমি একমত নই। অ্যাপ্লিকেশন কোডে, ডিবি কোড নিয়ে ডিলিং ব্যতীত, কোনও স্ট্রিং শ্রেণি হিসাবে বিবেচিত হওয়ার অর্থ নেই। এটি একটি মান ধরণের এবং একটি মৌলিক। সুপারকেট: আপনার কাছে +1
ফ্যাব্রিকিও আরাউজো

1
ডাটাবেস কোড একটি বড় "বাদে"। যতক্ষণ না কিছু সমস্যাযুক্ত ডোমেন রয়েছে যেখানে আপনাকে "উপস্থিত / জ্ঞাত, একটি খালি স্ট্রিং" এবং "উপস্থিত / অজানা / প্রয়োগযোগ্য নয়" যেমন ডাটাবেসগুলির মধ্যে পার্থক্য করতে হবে, তারপরে ভাষাটিকে সমর্থন করা দরকার। অবশ্যই এখন .NET আছে Nullable<>, স্ট্রিংগুলি মান ধরণের হিসাবে পুনরায় প্রয়োগ করা যেতে পারে; আমি এই জাতীয় পছন্দগুলির জন্য ব্যয় এবং সুবিধার সাথে কথা বলতে পারি না।

3
@ জোনফএলট্রেডস: সংখ্যার সাথে আচরণ করে এমন কোডটির আউট-অফ-ব্যান্ড থাকতে হবে ডিফল্ট মান শূন্যকে "অপরিজ্ঞাত" থেকে আলাদা করতে। যেমনটি হয়, স্ট্রিংস এবং সংখ্যার সাথে কাজ করে এমন নল-হ্যান্ডলিং কোডকে একটি পদ্ধতি অবলম্বনযোগ্য স্ট্রিংয়ের জন্য এবং অন্যটি নল সংখ্যার জন্য ব্যবহার করতে হয়। এমনকি যদি কোনও অবিচ্ছিন্ন শ্রেণীর ধরণটি stringতার চেয়ে বেশি দক্ষ হয় Nullable<string>তবে সমস্ত অণুগঠিত ডেটাবেস মানগুলির জন্য একই পদ্ধতির ব্যবহার করতে সক্ষম হওয়ার চেয়ে "আরও দক্ষ" পদ্ধতিটি ব্যবহার করা আরও ভারী।
সুপারক্যাট

5

কারণ স্ট্রিং ভেরিয়েবল একটি রেফারেন্স , উদাহরণ নয়

এটি ডিফল্টরূপে খালিতে শুরু করা সম্ভব হত তবে এটি পুরো বোর্ড জুড়ে প্রচুর অসঙ্গতিগুলির প্রচলন করত।


3
stringরেফারেন্স ধরণের হতে হবে এমন কোনও বিশেষ কারণ নেই । নিশ্চিত হওয়ার জন্য, স্ট্রিংটি তৈরি করে এমন প্রকৃত অক্ষরগুলি অবশ্যই গাদাতে সংরক্ষণ করতে হবে, তবে সিএলআরতে ইতিমধ্যে স্ট্রিংগুলির যে পরিমাণ উত্সর্গীকৃত সমর্থন রয়েছে তা System.Stringদিয়ে একটি মানের সাথে মান প্রকারের প্রসারিত হওয়া উচিত নয় Valueপ্রকারের একক ব্যক্তিগত ক্ষেত্র HeapString। এই ক্ষেত্রটি একটি রেফারেন্স টাইপ হবে এবং এতে ডিফল্ট হবে nullতবে এমন একটি Stringকাঠামো যার Valueক্ষেত্রটি শূন্য ছিল খালি স্ট্রিং হিসাবে আচরণ করবে। এই পদ্ধতির একমাত্র অসুবিধা হবে ...
সুপারক্যাট

1
... একটি ভোটদান Stringথেকে Objectরানটাইম বিশেষ-কেস কোডের অনুপস্থিতিতে হবে, বক্স সৃষ্টি হতে Stringগাদা উপর উদাহরণস্বরূপ কেবল একটি রেফারেন্স কপি চেয়ে বরং HeapString
সুপারক্যাট

1
@ সুপের্যাট - কেউই বলছেন না যে স্ট্রিংটি / মান ধরণের হওয়া উচিত।
হেন্ক হলটারম্যান

1
আমি ছাড়া আর কেউ নেই। স্ট্রিংটি একটি "বিশেষ" মান ধরণের (ব্যক্তিগত রেফারেন্স-ধরণের ক্ষেত্র সহ) হওয়া বেশিরভাগ হ্যান্ডলিংকে এখনকার মতো প্রয়োজনীয়ভাবে দক্ষ করার সুযোগ দেয়, পদ্ধতি / বৈশিষ্ট্য .Lengthইত্যাদির উপর যুক্ত নাল চেক ব্যতীত, যাতে উদাহরণগুলি রয়েছে একটি নাল রেফারেন্স এটিকে অবলম্বন করার চেষ্টা করবে না বরং পরিবর্তে খালি স্ট্রিংয়ের জন্য উপযুক্ত হিসাবে আচরণ করবে। ফ্রেমওয়ার্কটি stringসেভাবে বাস্তবায়িত হওয়ার সাথে ফ্রেমওয়ার্কটি আরও ভাল বা খারাপ হবে কিনা , যদি কেউ default(string)একটি খালি স্ট্রিং হতে চায় ...
সুপারক্যাট

1
... stringএকটি রেফারেন্স-টাইপ ফিল্ডে মান-ধরণের মোড়ক হওয়া এমন পদ্ধতির জন্য হবে যা নেট এর অন্যান্য অংশে খুব কম পরিবর্তন প্রয়োজন [সত্যিই যদি কেউ অতিরিক্ত বাক্সযুক্ত আইটেম তৈরির Stringজন্য রূপান্তর গ্রহণ করতে ইচ্ছুক Objectথাকে, কেবল এক হতে পারে Stringধরনের ক্ষেত্র সহ একজন সাধারণ struct হয় হতে Char[]যা কখনোই উন্মুক্ত]। আমি মনে করি একটি HeapStringপ্রকারটি সম্ভবত আরও ভাল হবে তবে কিছু উপায়ে মান ধরণের স্ট্রিংটি Char[]সহজ হবে।
সুপারক্যাট

5

সি # এর ডিজাইনাররা কেন স্ট্রিংয়ের ডিফল্ট মান হিসাবে নাল ব্যবহার করতে পছন্দ করেছেন?

স্ট্রিংগুলি রেফারেন্স ধরণের হওয়ায় রেফারেন্স টাইপগুলি হ'ল ডিফল্ট মান null। রেফারেন্স প্রকারের ভেরিয়েবলগুলি প্রকৃত ডেটাতে রেফারেন্স সঞ্চয় করে।

defaultএই ক্ষেত্রে কীওয়ার্ড ব্যবহার করা যাক ;

string str = default(string); 

strএটি একটি string, সুতরাং এটি একটি রেফারেন্স টাইপ , সুতরাং ডিফল্ট মান null

int str = (default)(int);

strএটি একটি int, তাই এটি একটি মানের ধরণ , তাই ডিফল্ট মান zero


4

যদি এর ডিফল্ট মানটি stringখালি স্ট্রিং হত তবে আমাকে পরীক্ষা করতে হবে না

ভুল! ডিফল্ট মান পরিবর্তন করা আসলে এটি কোনও রেফারেন্স টাইপ পরিবর্তন করে না এবং কেউ এখনও স্পষ্টভাবে রেফারেন্সটিকে সেট করতে পারে null

অতিরিক্তভাবে Nullable<String>জ্ঞান হবে।

সত্য কথা। এই বৈশিষ্ট্যের জন্য nullপরিবর্তে কোনও রেফারেন্স ধরণের জন্য অনুমতি না দেওয়া আরও অর্থবোধ তৈরি করবে Nullable<TheRefType>

তাহলে কেন সি # এর ডিজাইনার nullস্ট্রিংয়ের ডিফল্ট মান হিসাবে ব্যবহার করতে বেছে নিয়েছেন?

অন্যান্য রেফারেন্স ধরণের সাথে সামঞ্জস্যতা। এখন, কেন nullরেফারেন্স টাইপগুলিতে একেবারেই অনুমতি দেওয়া হচ্ছে ? সম্ভবত এটি এটি সি এর মতো বোধ করে, যদিও এটি এমন একটি ভাষায় প্রশ্নোত্তর নকশা সিদ্ধান্তও দেয় যা প্রদান করে Nullable


3
এটি হতে পারে কারণ নলবল কেবলমাত্র .NET 2.0 ফ্রেমওয়ার্কে চালু হয়েছিল, সুতরাং এর আগে এটি উপলব্ধ ছিল না?
jcolebrand

3
ড্যান বার্টনকে উল্লেখ করার জন্য ধন্যবাদ যে কেউ পরে শুরুতে রেফারেন্সের ধরণগুলিতে শুরুর দিকে মান সেট করতে পারেন। এর মাধ্যমে চিন্তাভাবনা করে আমাকে বলে যে প্রশ্নে আমার মূল অভিপ্রায়টি কোনও কাজে আসে না।
মার্সেল

4

??আপনার স্ট্রিং ভেরিয়েবল নির্ধারণের সময় আপনি যদি অপারেটরটি ব্যবহার করেন তবে এটি আপনাকে সহায়তা করতে পারে।

string str = SomeMethodThatReturnsaString() ?? "";
// if SomeMethodThatReturnsaString() returns a null value, "" is assigned to str.

2

স্ট্রিং একটি অপরিবর্তনীয় বস্তু যার অর্থ একটি মান দেওয়া হলে পুরানো মানটি স্মৃতি থেকে মুছে যায় না, তবে পুরানো স্থানে থাকে এবং নতুন মানটিকে একটি নতুন স্থানে স্থাপন করা হয়। তাই আপনি যদি ডিফল্ট মান String aছিল String.Empty, এটা অপচয় হবেString.Empty মেমরি ব্লক যখন এটা তার প্রথম মান দেওয়া হয়।

যদিও এটি ক্ষুদ্র বলে মনে হচ্ছে, এর ডিফল্ট মানগুলির সাথে স্ট্রিংয়ের একটি বড় অ্যারে শুরু করার সময় এটি কোনও সমস্যায় পরিণত হতে পারে String.Empty। অবশ্যই, আপনি StringBuilderযদি সর্বদা পরিবর্তনযোগ্য শ্রেণিটি ব্যবহার করতে পারেন তবে এটি যদি কোনও সমস্যা হয়ে থাকে।


"প্রথম সূচনা" জিনিসটি উল্লেখ করার জন্য ধন্যবাদ।
মার্সেল

3
বড় অ্যারে শুরু করার সময় কীভাবে সমস্যা হবে? যেহেতু, আপনি যেমন বলেছেন, স্ট্রিংগুলি পরিবর্তনযোগ্য নয়, অ্যারের সমস্ত উপাদান কেবল একই পয়েন্টার হতে পারে String.Empty। আমি কি ভুল করছি?
ড্যান বার্টন

2
যে কোনও ধরণের ডিফল্ট মানটি সমস্ত বিট শূন্যতে সেট করতে চলেছে। stringখালি স্ট্রিংয়ের ডিফল্ট মান হওয়ার একমাত্র উপায় হ'ল খালি স্ট্রিংয়ের উপস্থাপনা হিসাবে অল-বিট-শূন্যকে অনুমতি দেওয়া। এটি বেশ কয়েকটি উপায়ে সম্পন্ন হতে পারে তবে আমি মনে করি না যে কোনও উল্লেখের সূচনা প্রারম্ভিক করে জড়িত String.Empty
সুপারক্যাট

অন্যান্য উত্তরগুলিও এই বিষয়টিকে নিয়ে আলোচনা করেছে। আমি মনে করি লোকেরা এই সিদ্ধান্তে পৌঁছেছে যে স্ট্রিং ক্লাসটিকে একটি বিশেষ কেস হিসাবে বিবেচনা করা এবং অল-বিট-শূন্য ব্যতীত অন্য কিছু দেওয়ার জন্য ইনিশিয়েশন হিসাবে বিবেচনা করা বুদ্ধিমান হবে না, যদিও এটি কিছু ছিল String.Emptyবা এমন কি ""
djv

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

2

যেহেতু স্ট্রিং একটি রেফারেন্স টাইপ এবং রেফারেন্স টাইপের জন্য ডিফল্ট মান নাল।


0

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


3
objectকীওয়ার্ডের কি একই সত্য নয় ? যদিও স্বীকার করেছেন যে, এটি তুলনায় অনেক কম ব্যবহৃত হয় string

2
হিসাবে intজন্য একটি alias হয় System.Int32। তোমার লক্ষ্যটা কি? :)
থোররিন

@Thorari @delnan: তারা উভয় alias লেখা, কিন্তু System.Int32একটি হল Structএইভাবে একটি ডিফল্ট মান থাকার সময় System.Stringএকটি হল Classডিফল্ট মান সঙ্গে একটি পয়েন্টার থাকার null। তারা দৃশ্যত একই ফন্ট / রঙে উপস্থাপন করা হয়। জ্ঞান ছাড়াই, কেউ ভাবতে পারে তারা একইভাবে কাজ করে (= একটি ডিফল্ট মান থাকা)। আমার উত্তর দিয়ে লেখা হয়েছিল en.wikipedia.org/wiki/Cognitive_psychology এটি পিছনে :-) জ্ঞানীয় মনোবিজ্ঞান ধারণা
আলেসান্দ্রো দা Rugna

আমি মোটামুটি নিশ্চিত আন্ডারস হেলসবার্গ যা চ্যানেল 9 এর সাক্ষাত্কারে এটি বলেছিল। আমি গাদা এবং স্ট্যাকের মধ্যে পার্থক্য জানি কিন্তু সি # এর সাথে ধারণাটি হ'ল নৈমিত্তিক প্রোগ্রামারটির প্রয়োজন হয় না।
টমাস কোয়েল

0

২.০.৩০ অবধি নলেবল প্রকারগুলি আসে নি।

ভাষার শুরুতে যদি সংক্ষিপ্ত প্রকারগুলি তৈরি করা হত তবে স্ট্রিংটি নন-অ্যালবাম এবং স্ট্রিং হত? nullable হত। তবে তারা এই ডু পিছিয়ে সামঞ্জস্য করতে পারেনি।

প্রচুর লোক রেফ-টাইপ বা রেফ টাইপ নয় এমন বিষয়ে কথা বলে তবে স্ট্রিংটি সাধারণ শ্রেণির বাইরে একটি বিষয় এবং এটি সম্ভব করার জন্য সমাধানগুলি খুঁজে পাওয়া যেত।

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