কোনও () * * নাল রেফারেন্স ব্যতিক্রম নিক্ষেপ করা কি আশা করা অযৌক্তিক?


41

আপনি যখন একটি এক্সটেনশন পদ্ধতি আপনি যা করতে পারেন তৈরি করতে, অবশ্যই, এটা কল null.কিন্তু, একটি দৃষ্টান্ত পদ্ধতি কল অসদৃশ, নাল তে এটি কলিং না আছে একটি নিক্ষেপ করতে NullReferenceException-> আপনি চেক এবং নিজে নিক্ষেপ করতে হবে।

লিনক এক্সটেনশন পদ্ধতিটি কার্যকর করার জন্য Any()মাইক্রোসফ্ট সিদ্ধান্ত নিয়েছে যে তাদের একটি ArgumentNullException( https://github.com/dotnet/corefx/blob/master/src/System.Linq/src/System/Linq/AnyAll.cs ) নিক্ষেপ করা উচিত ।

এটি লেখার জন্য আমাকে বিরক্ত করে if( myCollection != null && myCollection.Any() )

আমি কি ভুল করছি, এই কোডের ক্লায়েন্ট হিসাবে, যেমন ((int[])null).Any()প্রত্যাবর্তন করা উচিত false?


41
সি # 6 এ, আপনি নিজের চেকটি সহজ করতে পারেন (মাইক্রোলেশন?। যে কোনও () == সত্য)
26

5
এমনকি এফ #, যা সত্যিই অন্য .NET ভাষার সঙ্গে ইনটেরোপিরাবিলিটি ছাড়া NULLs ব্যবহার করে না এ, null |> Seq.isEmptyছোঁড়ার System.ArgumentNullException: Value cannot be null। প্রত্যাশাটি মনে হয় যে আপনি যে কোনও কিছুর অস্তিত্ব প্রত্যাশিত মানের জন্য অপরিজ্ঞাত মানগুলি পাঠাবেন না, সুতরাং আপনার শূন্য হয়ে গেলে এটি এখনও একটি ব্যতিক্রম। এটি যদি প্রাথমিককরণের বিষয় হয় তবে আমি একটিটির পরিবর্তে একটি খালি ক্রম দিয়ে শুরু করব null
হারুন এম। ইশবাখ

21
এজন্য nullসংগ্রহগুলি নিয়ে কাজ করার সময় আপনার ফিরে আসা উচিত নয় বরং পরিবর্তে এই ক্ষেত্রে খালি সংগ্রহটি ব্যবহার করা উচিত।
বাকুরিউ

31
আচ্ছা এটি প্রথম স্থানে কেন নাল? আপনি শূন্য হিসাবে গণ্য করা শূন্য করতে চান না, কারণ এটি খালি নয়, এটি সম্পূর্ণ আলাদা। হতে পারে আপনি এটিকে আপনার ক্ষেত্রে খালি গণ্য করতে চান, তবে ভাষাতে এই জাতীয় জিনিস যুক্ত করার ফলে বাগগুলি বাড়ে।
ব্যবহারকারী 253751

22
আমার উল্লেখ করা উচিত যে প্রতিটি লিনকিউ পদ্ধতি একটি নাল আর্গুমেন্টের উপরে নিক্ষেপ করে। Anyঠিক সামঞ্জস্যপূর্ণ।
সেবাস্তিয়ান রেডল

উত্তর:


157

এতে আমার হাতে একটি ব্যাগ রয়েছে পাঁচটি আলু। .Any()ব্যাগে আলু আছে ?

" হ্যাঁ ," আপনি বলেছেন।<= true

আমি সব আলু বের করে এনে খাই। .Any()ব্যাগে আলু আছে ?

" না ," আপনি বলেন।<= false

আমি ব্যাগটিকে পুরোপুরি আগুনে জ্বালিয়ে দিই। .Any()ব্যাগে কি এখন আলু আছে ?

" ব্যাগ নেই ।"<= ArgumentNullException


3
কিন্তু শূন্যপদে, ব্যাগে আলু নেই? মিথ্যা বলতে মিথ্যা বোঝায় ... (আমি একমত নই, কেবলমাত্র দ্বিতীয় দৃষ্টিকোণ)।
ডি বেন নোবল

6
আরও ব্যবহারিকভাবে, কেউ আপনাকে একটি অজানা উত্স থেকে একটি বদ্ধ বাক্স দেয়। বাক্সে থাকা ব্যাগে কি কোনও আলু রয়েছে? আমি কেবল 2 টি পরিস্থিতিতেই আগ্রহী - ক) বাক্সে একটি ব্যাগ রয়েছে যাতে আলু রয়েছে, বা খ) বাক্সে কোনও আলু নেই এবং / অথবা কোনও ব্যাগ নেই। শব্দার্থকভাবে, হ্যাঁ, নাল এবং খালি মধ্যে পার্থক্য রয়েছে, তবে 99% সময় আমার যত্ন নেই।
ডেভ থিবেন

6
আপনি পাঁচটি কাঁচা আলু খেয়েছেন ?? অবিলম্বে চিকিত্সা যত্ন নিন।
অলি

3
@ অলি ড্যান ব্যাগ জ্বালানোর জন্য সেই আগুনটি খাওয়ার আগে এবং ব্যবহারের আগে সেগুলিকে আগুনে রান্না করেছিলেন।
ইসমাইল মিগুয়েল

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

52

প্রথমত, এটি প্রদর্শিত হবে যে উত্স কোড নিক্ষেপ করবে ArgumentNullException, না NullReferenceException

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

আমি কি ভুল করছি, এই কোডের ক্লায়েন্ট হিসাবে, যেমন ((int[])null).Any()প্রত্যাবর্তন করা উচিত false?

হ্যাঁ. যে Any()উত্তরটি উত্তর দেয় যে "এই সংগ্রহে কোনও উপাদান রয়েছে?" যদি এই সংগ্রহটি বিদ্যমান না থাকে, তবে প্রশ্নটি নিজেই অযৌক্তিক; এটি কোনও কিছুই ধারণ বা ধারণ করতে পারে না কারণ এটি বিদ্যমান নেই।


18
@ ক্রিসওহলার্ট: আপনার অন্তর্নিহিত আমাকে আগ্রহী। আপনি কি এও ভাবেন যে শব্দার্থগতভাবে, অস্তিত্বহীন ব্যক্তি একটি শূন্য ব্যক্তি, যার নাম শূন্য স্ট্রিং এবং বয়স শূন্য এবং আরও অনেক কিছু? এবং আপনি কি মনে করেন যে একটি সেট রয়েছে nullতা খালি সেট (এবং বিপরীতে) সমেত একটি সমতুল্য?
রুখ

17
@ ক্রিসওহলার্ট: অবশ্যই একটি সেট খালি সেট থাকতে পারে; তবে আপনি এটি বিশ্বাস করেন { null }এবং { {} }সমতুল্য হওয়া উচিত বলে মনে হয় । আমি দেখতে যে আকর্ষণীয়; আমি এর সাথে মোটেই সম্পর্ক করতে পারি না।
রুখ

9
উচিত .Addএকটি উপর nullসংগ্রহে একরকম খুব আমাদের জন্য একটি সংগ্রহ তৈরি?
ম্যাথু

13
@ChrisWohlert "একজন একটি খালি সেট বি একটি তরমুজ ধারণকারী একটি সেট আছে একটি খালি হল হ্যাঁ বি খালি নং হল সি খালি uhhh ...।।।?"
user253751

16
পেডেন্টিক পয়েন্ট: এটি এমনটি নয় যে সেট থিয়োরিতে একটি অ-বিদ্যমান সেটটি একটি খালি সেট। খালি সেটটি বিদ্যমান, এবং কোনও অ-বিদ্যমান সেট এটি নয় (এবং প্রকৃতপক্ষে এটি কিছুই নয়, যেহেতু এটি বিদ্যমান নেই)।
জেমস_পিক

22

নাল অর্থ হ'ল তথ্য, কোনও উপাদান নয়।

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

আপনি যদি কিছু পরিস্থিতিতে নালায় ফিরে আসছেন তবে আপনি খালি সংগ্রহটি ফিরিয়ে দিতে এটি পরিবর্তন করতে পারেন। (অন্যথায়, যদি আপনি লাইব্রেরি পদ্ধতিতে নাল ফিরে পেয়েছেন (আপনার নয়) এটি দুর্ভাগ্যজনক এবং আমি এগুলি স্বাভাবিক করার জন্য আবদ্ধ করব))

Https://stackoverflow.com/questions/1191919/hat-does-linq-return-whe-the-results-are-empty আরও দেখুন


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

1
@ ডেডুপ্লিকেটর, আপনি কি মাইক্রোসফ্টের অবজেক্ট লিংকিং এবং এম্বেডিং পার্কেন্সের কথা বলছেন? আপনি যদি মনে করেন তবে ওএলই 90 এর দশকের! আরও সন্ধান করুন, অনেক আধুনিক ভাষা (সি #, জাভা, সুইফট) নালীর ব্যবহারগুলি নির্মূল / নির্মূল করার জন্য সুবিধা সরবরাহ করছে।
এরিক tদ

2
@ এরিকইডট তারা কিছু করছে, nullকিছুটা কারণ এর অর্থ "তথ্য না থাকা"। nullএকটি একক অর্থবহ ব্যাখ্যা নেই। পরিবর্তে, আপনি এটি কীভাবে ব্যবহার করেন এটি বিষয়। nullকখনও কখনও "অনুপস্থিত তথ্য" এর জন্য ব্যবহৃত হয়, তবে "কোনও উপাদান নেই" এবং "ত্রুটি ঘটেছে" বা "অস্বীকৃতিবিহীন" বা "বিরোধী তথ্য" বা কিছু স্বেচ্ছাসেবী বিষয় হিসাবে ব্যবহৃত হয়।
ডেরেক এলকিন্স

-1। এটি অ্যাবস্ট্রাক্ট তত্ত্ব দ্বারা নয়, বিকাশকারী দ্বারা নেওয়া একটি সিদ্ধান্ত। nullএকেবারে ঘন ঘন "ডেটা নেই" বোঝাতে ব্যবহৃত হয়। কখনও কখনও এটি জ্ঞান করে তোলে। অন্য সময়, না।
jpmc26

13

নাল-কন্ডিশনাল বাক্য গঠন ছাড়াও , এই সমস্যাটি দূর করার জন্য আরও একটি কৌশল রয়েছে: আপনার পরিবর্তনশীলটি সর্বদা থেকে যায় না null

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

public MyResult DoSomething(int a, IEnumerable<string> words)
{
    words = words ?? Enumerable.Empty<string>();

    if (!words.Any())
    {
        ...

আপনি অন্য কোনও পদ্ধতি থেকে সংগ্রহগুলি আনার সময় আপনি এটি করতে পারেন:

var words = GetWords() ?? Enumerable.Empty<string>();

(মনে রাখবেন যে কোনও ক্ষেত্রে যেমন আপনার কোনও নিয়ন্ত্রণ যেমন নিয়ন্ত্রণ থাকে GetWordsএবং nullখালি সংগ্রহের সমতুল্য হয়, কেবলমাত্র খালি সংগ্রহটি প্রথম স্থানে ফিরিয়ে দেওয়া ভাল)

এখন আপনি সংগ্রহটিতে আপনার যে কোনও অপারেশন সম্পাদন করতে পারেন। এটি বিশেষত সহায়ক যদি আপনার সংগ্রহগুলি ব্যর্থ হওয়ার পরে এমন অনেকগুলি ক্রিয়াকলাপ সম্পাদন করার প্রয়োজন হয় nullএবং আপনি যদি খালি গণনার বাইরে চলে যেতে বা জিজ্ঞাসা করে একই ফলাফল পান তবে এটি ifসম্পূর্ণরূপে শর্ত দূর করার অনুমতি দেবে ।


12

এই কোডের ক্লায়েন্ট হিসাবে আমি কি ভুল করছি, যেমন ((int []) নাল) আশা করি? যে কোনও () মিথ্যা ফিরানো উচিত?

হ্যাঁ, কেবল কারণ আপনি সি # তে রয়েছেন এবং সেই আচরণটি ভালভাবে সংজ্ঞায়িত এবং ডকুমেন্টেড।

আপনি যদি নিজের লাইব্রেরি তৈরি করছিলেন, বা যদি আপনি ভিন্ন ব্যতিক্রম সংস্কৃতি সহ কোনও ভিন্ন ভাষা ব্যবহার করেন তবে মিথ্যা আশা করা আরও যুক্তিযুক্ত।

ব্যক্তিগতভাবে আমি অনুভব করি যেহেতু মিথ্যা রিটার্ন একটি নিরাপদ পদ্ধতি যা আপনার প্রোগ্রামকে আরও দৃ rob় করে তোলে তবে এটি অন্তত বিতর্কযোগ্য।


15
এই 'দৃust়তা' প্রায়শই একটি মায়া হয় - যদি বাগ বা অন্য সমস্যার কারণে অ্যারে তৈরি করা কোডটি হঠাৎ করে NULL তৈরি করা শুরু করে, আপনার 'দৃust়' কোডটি সমস্যাটি আড়াল করবে। এটি সময়ে উপযুক্ত আচরণ, তবে এটি কোনও নিরাপদ ডিফল্ট নয়।
GoatInTheMachine

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

10
যদি কোনও কিছু ভেঙে যায়, তা আমার কোড, অন্য সহকর্মী বা ক্লায়েন্টের হোক না কেন, আমি কোডটি সাথে সাথেই ব্যর্থ হয়েছি এবং লোকেরা এটি সম্পর্কে জানত যে এটি একটি সম্ভাব্য অসামঞ্জস্য অবস্থায় চালিত হওয়ার চেয়ে সময় নির্ধারিত সময়ের জন্য for এটি করতে সক্ষম হওয়া অবশ্যই কখনও কখনও বিলাসিতা এবং সর্বদা উপযুক্ত নয় তবে এটি আমার পছন্দ approach
GoatInTheMachine

1
@ গোয়েটইনম্যাচাইন - আমি প্রচুর জিনিসের জন্য একমত, কিন্তু সংগ্রহগুলি আলাদা to শূন্য সংগ্রহ হিসাবে নালটিকে চিকিত্সা করা ভয়ঙ্করভাবে বেমানান বা অবাক করা আচরণ নয়।
টেলাস্টিন

8
কল্পনা করুন যে আপনার কাছে এমন একটি অ্যারে রয়েছে যা কোনও ওয়েব অনুরোধের মাধ্যমে প্রাপ্ত জেএসওএন নথি থেকে পপুলেট হয়েছে এবং উত্পাদনে আপনার এপিআই-র কোনও ক্লায়েন্টের হঠাৎই একটি সমস্যা হয়েছে যেখানে তারা আংশিকভাবে অবৈধ জেএসওনের মাধ্যমে প্রেরণ করে আপনাকে NULL হিসাবে একটি অ্যারে ডিজিটালাইজ করার কারণ করে: কোডটি, সবচেয়ে খারাপভাবে, প্রথম খারাপ অনুরোধটি আসার মুহুর্তেই একটি NUL রেফারেন্স ব্যতিক্রম ছুঁড়ে মারল, যা আপনি লগ ইন করতে দেখবেন এবং সাথে সাথে ক্লায়েন্টকে তাদের ভাঙ্গা অনুরোধগুলি ঠিক করতে বলুন, বা আপনার কোডটি বলে "ওহ, অ্যারের খালি, কিছুই নেই" করতে!" এবং চুপচাপ কয়েক সপ্তাহ ধরে ডিবিতে 'ক্রয়ের ঝুড়ির কোনও আইটেম ছিল না'?
GoatInTheMachine

10

যদি বারবার নাল-চেকগুলি আপনাকে বিরক্ত করে, আপনি নিজের নামের 'স্ট্রিং পদ্ধতিটি মিরর করতে, আপনার নিজের' ইসনুলআরএম্পটি () 'এক্সটেনশন পদ্ধতি তৈরি করতে এবং নাল-চেক এবং .একটি () কলকে একটি একক কলটিতে মোড়া করতে পারেন।

অন্যথায়, আপনার প্রশ্নের অধীনে একটি মন্তব্যে 26 এর 17 দ্বারা উল্লিখিত সমাধানটি 'স্ট্যান্ডার্ড' পদ্ধতির চেয়েও ছোট এবং নতুন নাল-শর্তযুক্ত সিনট্যাক্সের সাথে পরিচিত প্রত্যেকের পক্ষে যুক্তিসঙ্গতভাবে পরিষ্কার clear

if(myCollection?.Any() == true)

4
আপনি ?? falseপরিবর্তে ব্যবহার করতে পারে == true। এটি আমার কাছে আরও স্পষ্ট (ক্লিনার) বলে মনে হবে যেহেতু এটি কেবলমাত্র ক্ষেত্রেই পরিচালনা করে nullএবং এটি আসলে আর কোনও শব্দভাণ্ডার নয়। ==বুলিয়ানদের জন্য প্লাস চেকগুলি সাধারণত আমার ঠাট্টা প্রতিবিম্বকে ট্রিগার করে। =)
jpmc26

2
@ jpmc26: সি # সম্পর্কে আমি বেশি কিছু জানি না। কেন myCollection?.Any()পর্যাপ্ত নয় ?
এরিক ডুমিনিল

6
@ এরিকডুমিনিল যেভাবে নাল-কন্ডিশনাল অপারেটর কাজ করে, সে কারণে myCollection?.Any()কার্যকরভাবে একটি সাধারণ বুলিয়ান (যে, বুলের পরিবর্তে বুল?) পরিবর্তে একটি নল-বুলিয়ান ফিরিয়ে দেয়। বুল থেকে কোন অন্তর্নিহিত রূপান্তর আছে? বুল করার জন্য, এবং এটি আমাদের এই বিশেষ উদাহরণে ( ifশর্তের অংশ হিসাবে পরীক্ষা করার জন্য ) একটি বুল প্রয়োজন । সুতরাং, আমাদের অবশ্যই trueনাল-কোয়েলসিং অপারেটর (??) এর সাথে স্পষ্টভাবে তুলনা বা ব্যবহার করতে হবে।
স্টিভেন র্যান্ডস

@ jpmc26 ?? মিথ্যাটি পড়া আমার পক্ষে কঠিন তবে কি আমার সংগ্রহ?? যে কোনও () == সত্য। আপনার গ্যাগ রিফ্লেক্স নির্বিশেষে, == সত্য আপনি যা স্পষ্টভাবে পরীক্ষা করার চেষ্টা করছেন। ?? মিথ্যা কেবল অতিরিক্ত শব্দের যোগ করে এবং নাল হলে কী ঘটে যায় সে সম্পর্কে আপনার এখনও মূল্যায়ন করতে হবে, সেই নাল == সত্য ব্যর্থ হবে, প্রায় পাঠককে এমনকি সচেতন হওয়া ছাড়া ?.
রায়ান দি লিচ

2
@ রায়ান দ্য লেচ ==আসলে আমাকে কাজ করবে কিনা সে সম্পর্কে আমাকে আরও কঠোর চিন্তা করতে হবে। আমি ইতিমধ্যে জানি যে বুলিয়ান স্বজ্ঞাতভাবে কী ঘটে যখন এটি কেবল হতে পারে trueবা false; এমনকি আমি এটি সম্পর্কে চিন্তা করতে হবে না। তবে nullমিশ্রণটি নিক্ষেপ করুন এবং এখন এটি ঠিক আছে কিনা তা নিয়ে আমাকে কাজ করতে হবে ==??পরিবর্তে কেবল nullকেসটিকে সরিয়ে দেয়, এটি এটিকে আবার হ্রাস করে trueএবং falseযা আপনি ইতিমধ্যে অবিলম্বে বুঝতে পেরেছেন। আমার গ্যাগ রিফ্লেক্স হিসাবে, যখন আমি এটি প্রথম দেখি, আমার তাত্ক্ষণিক প্রবৃত্তিটি এটি কেবল মুছে ফেলা হয় কারণ এটি সাধারণত অকেজো, যা আপনি চান না।
jpmc26

8

এই কোডের ক্লায়েন্ট হিসাবে আমি কি ভুল করছি, যেমন ((int []) নাল) আশা করি? যে কোনও () মিথ্যা ফিরানো উচিত?

আপনি যদি প্রত্যাশা সম্পর্কে অবাক হন তবে আপনাকে উদ্দেশ্য সম্পর্কে ভাবতে হবে।

null এর থেকে খুব আলাদা কিছু বোঝায় Enumerable.Empty<T>

এরিক Eidদতের উত্তরে যেমন উল্লেখ করা হয়েছে , nullখালি সংগ্রহের মধ্যে অর্থের মধ্যে পার্থক্য রয়েছে ।

সেগুলি কীভাবে ব্যবহার করা হবে সে সম্পর্কে প্রথম নজরে আসুন।

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

এক্স সংগ্রহের বৈশিষ্ট্যগুলি থেকে বা সংগ্রহগুলি ফেরত দেওয়ার পদ্ধতিগুলি থেকে নাল মানগুলি ফেরান না। পরিবর্তে একটি খালি সংগ্রহ বা একটি খালি অ্যারে ফিরুন।

আপনার কল করার এমন একটি পদ্ধতি বিবেচনা করুন যা শেষ পর্যন্ত একটি ডাটাবেস থেকে ডেটা পাচ্ছে: আপনি যদি খালি অ্যারে পান বা এর Enumerable.Empty<T>সহজ অর্থ হয় আপনার নমুনা স্থানটি খালি, অর্থাৎ আপনার ফলাফলটি খালি সেটnullএই প্রসঙ্গে প্রাপ্তি , তবে একটি ত্রুটি অবস্থার ইঙ্গিত দেয় ।

ড্যান উইলসনের আলুর উপমা হিসাবে একই ধরণের চিন্তাধারায় আপনার ডেটাটি খালি সেট হলেও প্রশ্ন জিজ্ঞাসা করা বুদ্ধিমানের কাজ । তবে সেটটি যদি না থাকে তবে এটি অনেক কম বোঝায় ।


1
তাদের বিভিন্ন অর্থ রয়েছে কিনা তা প্রসঙ্গে নির্ভরশীল। প্রায়শই, যুক্তি হাতে থাকা যাই হোক না কেনের উদ্দেশ্যে, তারা সমতুল্য ধারণাগুলি উপস্থাপন করে। সবসময় না , তবে প্রায়শই।
jpmc26

1
@ jpmc26: আমি মনে করি এই উত্তরটির মূল বক্তব্যটি সি # এর জন্য নির্দেশিকাগুলি কোড করে তাদের আলাদা অর্থ রয়েছে। আপনি সর্বদা কোডটি ঠিক করতে পারেন যেখানে আপনি চাইলে নাল এবং খালি একই থাকে। এবং কিছু ক্ষেত্রে আপনি একই জিনিসটি বাতিল বা খালি হোক তা করতে পারেন তবে এর অর্থ এই নয় যে তারা একই জিনিসটি বোঝায়।
ক্রিস

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

আপনি যা বলছেন তাতে আমি বিভ্রান্ত হতে পারি তবে যখন ফলাফল উত্পন্ন করার জন্য নালিকা এবং শূন্য সমতুল্য আমি দেখতে পাচ্ছি না কেন আপনি কেবল পৃথকভাবে ব্যবহার করবেন না কেন বাতিল এবং খালি চেকগুলি এমন পদ্ধতি না চাওয়া যা একবারে উভয়ই করে তবে আপনাকে অন্য পরিস্থিতিতে তাদের আলাদা করতে দেয় না ...
ক্রিস

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

3

কেন nullএবং খালি আলাদা তা ব্যাখ্যা করার অনেক উত্তর রয়েছে এবং তাদের সাথে কেন অন্যরকম আচরণ করা উচিত বা না করা উচিত তা উভয়েরই ব্যাখ্যা করার চেষ্টা করা যথেষ্ট মতামত । তবে আপনি জিজ্ঞাসা করছেন:

এই কোডের ক্লায়েন্ট হিসাবে আমি কি ভুল করছি, যেমন ((int []) নাল) আশা করি? যে কোনও () মিথ্যা ফিরানো উচিত?

এটি পুরোপুরি যুক্তিসঙ্গত প্রত্যাশা । আপনি অন্যের মতো বর্তমানের আচরণের পক্ষে পরামর্শ দিচ্ছেন ঠিক তেমনি। আমি বর্তমান বাস্তবায়ন দর্শনের সাথে একমত তবে ড্রাইভিং কারণগুলি কেবলমাত্র নয় - প্রসঙ্গ বিবেচনার বাইরে।

প্রদত্ত Any()ছাড়াই প্রয়োজনীয়ভাবে দেওয়া হয় Count() > 0তবে আপনি এই স্নিপেট থেকে কী আশা করবেন?

List<int> list = null;
if (list.Count > 0) {}

বা জেনেরিক:

List<int> list = null;
if (list.Foo()) {}

আমি তোমাকে আশা করি অনুমান করা NullReferenceException

  • Any()এটি একটি এক্সটেনশন পদ্ধতি, এটি প্রসারিত অবজেক্টের সাথে সহজেই সংহত করা উচিত তবে ব্যতিক্রম নিক্ষেপ করা সর্বনিম্ন আশ্চর্যের বিষয়।
  • প্রতিটি .NET ভাষা এক্সটেনশন পদ্ধতি সমর্থন করে না।
  • আপনি সর্বদা কল করতে পারেন Enumerable.Any(null)এবং সেখানে আপনি অবশ্যই আশা করতে পারেন ArgumentNullException। এটি একই পদ্ধতি এবং এটি ফ্রেমওয়ার্কের সাথে - সম্ভবত - প্রায় সব কিছুতেও সামঞ্জস্য থাকতে হবে।
  • কোনও nullবস্তু অ্যাক্সেস একটি প্রোগ্রামিং ত্রুটি , ফ্রেমওয়ার্কটি যাদু মান হিসাবে নাল প্রয়োগ করা উচিত নয় । আপনি যদি সেভাবে ব্যবহার করেন তবে এটি মোকাবেলা করার দায়িত্ব আপনার।
  • এটি মতামতযুক্ত , আপনি এক উপায়ে ভাবেন এবং আমি অন্যভাবে মনে করি। ফ্রেমওয়ার্ক যতটা সম্ভব অপরিবর্তিত হওয়া উচিত।
  • যদি আপনার একটি বিশেষ কেস থাকে তবে অবশ্যই আপনাকে সামঞ্জস্য রাখতে হবে : অন্যান্য সমস্ত এক্সটেনশন পদ্ধতি সম্পর্কে আপনাকে আরও এবং বেশি উচ্চ মতামতপূর্ণ সিদ্ধান্ত নিতে হবে: যদি Count()সহজ সিদ্ধান্ত মনে Where()হয় তবে তা নয়। কি হবে Max()? এটি একটি EMPTY তালিকার জন্য একটি ব্যতিক্রম ছুঁড়েছে, এটি nullএকটির জন্যও নিক্ষেপ করা উচিত নয় ?

nullএকটি বৈধ মান (উদাহরণস্বরূপ String.IsNullOrEmpty()) হওয়ার পরে LINQ এর আগে লাইব্রেরি ডিজাইনাররা সুস্পষ্ট পদ্ধতিগুলি প্রবর্তন করার আগে কী করেছিল তা হলে তারা বিদ্যমান ডিজাইনের দর্শনের সাথে সামঞ্জস্য থাকতে পারে । এটি বলেছিল, এমনকি লিখতে বেশ তুচ্ছ, দুটি পদ্ধতি EmptyIfNull()এবং কার্যকর EmptyOrNull()হতে পারে।


1

জিম প্রতিটি ব্যাগে আলু রেখে যাওয়ার কথা। না হলে আমি তাকে মেরে ফেলছি।

জিমের একটি ব্যাগ রয়েছে এতে পাঁচটি আলু রয়েছে। .Any()ব্যাগে আলু আছে ?

"হ্যাঁ," আপনি বলেছেন। <= সত্য

ঠিক আছে তাই জিম এবার বেঁচে আছে।

জিম সমস্ত আলু বের করে সেগুলি খায়। আছে। ব্যাগে কোনও () আলু?

"না," আপনি বলেন। <= মিথ্যা

জিমকে মেরে ফেলার সময়।

জিম ব্যাগটিকে পুরোপুরি আগুনে জ্বলিয়ে দেয়। আছে। ব্যাগে এখন কোনও (আলু) আছে?

"ব্যাগ নেই।" <= আর্গুমেন্টনাল এক্সসেপশন

জিম বাঁচা উচিত বা মারা উচিত? ভাল আমরা এটি আশা করিনি তাই আমার একটি রায় দরকার। জিমকে এই বাগ দিয়ে ফেলে দিতে দিচ্ছে নাকি?

আপনি কোনও নাল শেননিগানকে এভাবে রাখছেন না এমন সিগন্যাল দেওয়ার জন্য আপনি টীকাগুলি ব্যবহার করতে পারেন

public bool Any( [NotNull] List bag ) 

তবে আপনার সরঞ্জাম চেইনটিকে এটি সমর্থন করতে হবে। যার অর্থ আপনি সম্ভবত এখনও চেক লেখার শেষ করবেন।


0

যদি এটি আপনাকে এতটা বিরক্ত করে, আমি একটি সাধারণ বর্ধিতকরণ পদ্ধতির পরামর্শ দিই।

static public IEnumerable<T> NullToEmpty<T>(this IEnumerable<T> source)
{
    return (source == null) ? Enumerable.Empty<T>() : source;
}

এখন আপনি এটি করতে পারেন:

List<string> list = null;
var flag = list.NullToEmpty().Any( s => s == "Foo" );

... এবং পতাকা সেট করা হবে false


2
returnবিবৃতিটি লেখার মতো আরও স্বাভাবিক :return source ?? Enumerable.Empty<T>();
জেপ্পে স্টিগ নীলসন

এটি জিজ্ঞাসিত প্রশ্নের উত্তর দেয় না।
কেনেথ কে।

@ কেনেথকে.বিট মনে হচ্ছে যে উপস্থাপিত সমস্যাটি সমাধান হবে।
আরকিউকিউ

0

এটি সি # এর সম্প্রসারণ পদ্ধতি এবং তাদের নকশার দর্শন সম্পর্কে একটি প্রশ্ন, তাই আমি মনে করি যে এই প্রশ্নের উত্তর দেওয়ার সর্বোত্তম উপায় হ'ল এমএসডিএন এর ডকুমেন্টেশনগুলি বর্ধিত পদ্ধতির উদ্দেশ্য হিসাবে উদ্ধৃত করা :

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

...

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

এমন কোনও প্রসারকে প্রসারিত করার জন্য কোনও এক্সটেনশন পদ্ধতি ব্যবহার করার সময় যার উত্স কোডটি আপনি পরিবর্তন করতে পারবেন না, আপনি এই ঝুঁকিটি চালান যে প্রকারের প্রয়োগের ফলে আপনার এক্সটেনশন পদ্ধতিটি ভেঙে যাবে।

আপনি যদি কোনও নির্দিষ্ট ধরণের জন্য এক্সটেনশন পদ্ধতিগুলি বাস্তবায়ন করেন তবে নীচের বিষয়গুলি মনে রাখবেন:

  • প্রকারে সংজ্ঞায়িত পদ্ধতিটির মতো একই স্বাক্ষর থাকলে কোনও এক্সটেনশন পদ্ধতি কখনই ডাকা হবে না।
  • নাম স্থান পর্যায়ে সম্প্রসারণ পদ্ধতি স্কোপটিতে আনা হয়। উদাহরণস্বরূপ, যদি আপনার একাধিক স্ট্যাটিক ক্লাস থাকে যার একটি একক নেমস্পেসের নামকরণে এক্সটেনশন পদ্ধতি থাকে Extensionsতবে সেগুলি using Extensions;নির্দেশের মাধ্যমে সমস্তটি স্কোপে আনা হবে ।

সংক্ষিপ্তসার হিসাবে, বিকাশকারীরা সরাসরি এটি না করতে পারলেও একটি বিশেষ ধরণের ক্ষেত্রে উদাহরণ পদ্ধতি যুক্ত করার জন্য এক্সটেনশন পদ্ধতিগুলি ডিজাইন করা হয় are এবং যেহেতু উদাহরণস্বরূপ পদ্ধতিগুলি সর্বদা উপস্থিত থাকলে এক্সটেনশন পদ্ধতিগুলিকে ওভাররাইড করবে (যদি উদাহরণ পদ্ধতি সিনট্যাক্স ব্যবহার করে বলা হয়), এটি কেবল তখনই করা উচিত যদি আপনি সরাসরি কোনও পদ্ধতি যোগ করতে বা শ্রেণি প্রসারিত করতে না পারেন। *

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


যখন সি # 3.0 মুক্তি পায় ততক্ষনে ব্যবহার করছেন সেটি ক্লায়েন্ট লক্ষ লক্ষ ছিল: * একটি সাইড নোট, এই ঠিক অবস্থা যে LINQ এর ডিজাইনার মুখোমুখি হয় System.Collections.IEnumerableএবং System.Collections.Generic.IEnumerable<T>তাদের সংগ্রহের এবং উভয়, foreachলুপ। এই শ্রেণীর ফিরে IEnumeratorবস্তু যা শুধুমাত্র দুটি পদ্ধতি ছিল Currentএবং MoveNextআছে, তাই যেমন কোন অতিরিক্ত প্রয়োজনীয় উদাহরণস্বরূপ পদ্ধতি, যোগ Count, Anyইত্যাদি ক্লায়েন্টদের এই লক্ষ লক্ষ ভঙ্গ করা হবে। সুতরাং, এই কার্যকারিতাটি সরবরাহ করার জন্য (বিশেষত যেহেতু এটি কার্যকর CurrentMoveNextআপেক্ষিক স্বাচ্ছন্দ্যের সাথে প্রয়োগ করা যেতে পারে ), তারা এটিকে এক্সটেনশন পদ্ধতি হিসাবে প্রকাশ করেছে যা বর্তমানে বিদ্যমান যে কোনও ক্ষেত্রে প্রয়োগ করা যেতে পারেIEnumerableউদাহরণস্বরূপ এবং আরও দক্ষ উপায়ে ক্লাস দ্বারা প্রয়োগ করা যেতে পারে। যদি সি # এর ডিজাইনাররা প্রথম দিনেই লিনকিউ প্রকাশ করার সিদ্ধান্ত নিয়েছে তবে এটির উদাহরণ পদ্ধতি হিসাবে সরবরাহ করা IEnumerableহত এবং তারা সম্ভবত এই পদ্ধতিগুলির ডিফল্ট ইন্টারফেস বাস্তবায়ন সরবরাহ করার জন্য কোনও ধরণের সিস্টেম ডিজাইন করেছিলেন।


0

আমি মনে করি এখানে মূল বক্তব্যটি হ'ল কোনও ব্যতিক্রম ছুঁড়ানোর পরিবর্তে মিথ্যা ফিরিয়ে দিয়ে আপনি এমন তথ্যের উদ্রেক করছেন যা আপনার কোডের ভবিষ্যতের পাঠক / সংশোধকদের জন্য প্রাসঙ্গিক হতে পারে।

যদি তালিকাটি বাতিল হওয়া সম্ভব হয় তবে আমি এর জন্য একটি পৃথক যুক্তিযুক্ত পথ রাখার পরামর্শ দেব, কারণ ভবিষ্যতে অন্য কেউ যদি আপনার তালিকার অন্য to to সাথে কিছু তালিকা ভিত্তিক যুক্তি (একটি অ্যাডের মতো) যুক্ত করতে পারে, ফলে অযাচিত ব্যতিক্রম যে তাদের ভবিষ্যদ্বাণী করার কোনও কারণ ছিল না।

পঠনযোগ্যতা এবং রক্ষণাবেক্ষণযোগ্যতা ট্রাম্প প্রতিবার 'আমাকে একটি অতিরিক্ত শর্ত লিখতে হবে'।


0

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

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

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