হ্যাঁ, এর ভাল কারণ রয়েছে:
- এটি নাল কি ঠিক তা সনাক্ত করে, যা এ থেকে স্পষ্ট নাও হতে পারে
NullReferenceException
- এটি কোডটি অকার্যকর ইনপুটটিতে ব্যর্থ করে দেয় এমনকি অন্য কোনও শর্তের অর্থ হল যে মানটি অবচিত হয় না
- পদ্ধতিটি আপনার প্রথম ডিসেরেন্সের আগে পৌঁছতে পারে এমন কোনও অন্য পার্শ্ব প্রতিক্রিয়া হওয়ার আগেই এটি ব্যতিক্রম ঘটায়
- এর অর্থ আপনি আত্মবিশ্বাসী হতে পারেন যে আপনি যদি প্যারামিটারটি অন্য কোনও কিছুতে পাস করেন তবে আপনি তাদের চুক্তি লঙ্ঘন করছেন না
- এটি আপনার পদ্ধতির প্রয়োজনীয়তার ডকুমেন্টগুলি ( কোড চুক্তি ব্যবহারের ক্ষেত্রে অবশ্যই আরও ভাল)
এখন আপনার আপত্তি হিসাবে:
- এটি ধীরে ধীরে : আপনি কি এটি খুঁজে পেয়েছেন যা আপনার কোডটিতে আসলেই বাধা হয়ে দাঁড়িয়েছে বা আপনি কী অনুমান করছেন? ন্যূনালিটি চেকগুলি খুব দ্রুত এবং বেশিরভাগ ক্ষেত্রে তারা বাধা হয়ে দাঁড়ায় না
- কোডটি বজায় রাখা আরও শক্ত করে তোলে : আমি তার বিপরীতে মনে করি। আমি মনে করি যে কোনও পরামিতি নালাগুলি হতে পারে কিনা সেদিকে স্ফটিক স্পষ্ট করে দেওয়া কোডটি ব্যবহার করা আরও সহজ , এবং যেখানে আপনি নিশ্চিত যে এই শর্তটি প্রয়োগ করা হয়েছে।
এবং আপনার দাবির জন্য:
স্পষ্টতই, যে কোডগুলি এস ব্যবহার করে তা কোনওভাবেই ব্যতিক্রম ছুঁড়ে ফেলবে।
সত্যি? বিবেচনা:
void f(SomeType s)
{
Console.WriteLine("I've got a message of {0}", s);
}
এটি ব্যবহার করে s
তবে এটি ব্যতিক্রম হয় না। যদি এটি বাতিল হয়ে যায় তবে এটি অবৈধ s
এবং এটি ইঙ্গিত দেয় যে কিছু ভুল হয়েছে, একটি ব্যতিক্রম এখানে সর্বাধিক উপযুক্ত আচরণ।
এখন আপনি এই যুক্তি যাচাইকরণের চেকগুলি কোথায় রেখেছেন তা আলাদা বিষয়। আপনি নিজের শ্রেণীর মধ্যে সমস্ত কোড বিশ্বাস করার সিদ্ধান্ত নিতে পারেন, তাই ব্যক্তিগত পদ্ধতিতে বিরক্ত করবেন না। আপনি আপনার বাকী সমাবেশে আস্থা রাখার সিদ্ধান্ত নিতে পারেন, তাই অভ্যন্তরীণ পদ্ধতিতে বিরক্ত করবেন না। আপনার অবশ্যই অবশ্যই জনসাধারণের পদ্ধতির জন্য যুক্তিগুলির বৈধতা দেওয়া উচিত।
একটি পার্শ্ব নোট: এর একক-প্যারামিটার কনস্ট্রাক্টর ওভারলোড ArgumentNullException
কেবলমাত্র প্যারামিটারের নাম হওয়া উচিত, সুতরাং আপনার পরীক্ষাটি হওয়া উচিত:
if (s == null)
{
throw new ArgumentNullException("s");
}
বিকল্পভাবে আপনি কিছুটা সংযোজনকে মঞ্জুরি দিয়ে একটি এক্সটেনশন পদ্ধতি তৈরি করতে পারেন:
s.ThrowIfNull("s");
আমার (জেনেরিক) এক্সটেনশন পদ্ধতির সংস্করণে, আমি এটিকে মূল মানটি যদি নালাগুলি না দেয় তবে তা ফিরিয়ে আনব, যাতে আপনাকে এই জাতীয় জিনিস লিখতে দেয়:
this.name = name.ThrowIfNull("name");
আপনার যদি খুব বেশি বিরক্ত না হয় তবে আপনার একটি ওভারলোডও থাকতে পারে যা প্যারামিটারের নাম নেয় না।