এখানে দুটি সমস্যা রয়েছে: 1) কোনও প্রকারটি অযোগ্য কিনা তা পরীক্ষা করা; এবং 2) কোনও বস্তু nallaable প্রকার প্রতিনিধিত্ব করে কিনা তা পরীক্ষা করে দেখুন।
ইস্যু 1 (একটি ধরণের পরীক্ষার জন্য) এর জন্য, আমি নিজের সিস্টেমে ব্যবহার করেছি এমন একটি সমাধান এখানে দেওয়া হয়েছে: TypeIsNullaable-check সমাধান
ইস্যু 2 (কোনও অবজেক্টের পরীক্ষার জন্য), উপরে ডিন চকের সমাধানটি মান ধরণের জন্য কাজ করে, তবে এটি রেফারেন্স ধরণের জন্য কাজ করে না, কারণ <T> ওভারলোড সর্বদা মিথ্যা প্রত্যাবর্তন করে। যেহেতু রেফারেন্সের প্রকারগুলি অন্তর্নিহিতভাবে আবদ্ধ হয়, একটি রেফারেন্স ধরণের পরীক্ষা করা সর্বদা সত্য হওয়া উচিত। এই শব্দার্থবিজ্ঞানের ব্যাখ্যার জন্য দয়া করে নীচের নোটটি ["ন্যূনযোগ্যতা"] দেখুন। সুতরাং, এখানে আমার ডিনের পদ্ধতির পরিবর্তন হয়েছে:
public static bool IsObjectNullable<T>(T obj)
{
// If the parameter-Type is a reference type, or if the parameter is null, then the object is always nullable
if (!typeof(T).IsValueType || obj == null)
return true;
// Since the object passed is a ValueType, and it is not null, it cannot be a nullable object
return false;
}
public static bool IsObjectNullable<T>(T? obj) where T : struct
{
// Always return true, since the object-type passed is guaranteed by the compiler to always be nullable
return true;
}
এবং উপরের সমাধানের জন্য ক্লায়েন্ট-পরীক্ষার কোডটিতে আমার পরিবর্তনটি এখানে রয়েছে:
int a = 123;
int? b = null;
object c = new object();
object d = null;
int? e = 456;
var f = (int?)789;
string g = "something";
bool isnullable = IsObjectNullable(a); // false
isnullable = IsObjectNullable(b); // true
isnullable = IsObjectNullable(c); // true
isnullable = IsObjectNullable(d); // true
isnullable = IsObjectNullable(e); // true
isnullable = IsObjectNullable(f); // true
isnullable = IsObjectNullable(g); // true
আইসোবজেক্টনুলাল <টি> (টি টি) তে আমি ডিনের পদ্ধতির পরিবর্তন করেছি কারণ তার আসল পদ্ধতির জন্য সবসময়ই কোনও রেফারেন্স টাইপের জন্য মিথ্যা ফিরে আসে। যেহেতু আইসোবজেক্টনুলের মতো কোনও পদ্ধতিতে রেফারেন্স-ধরণের মানগুলি পরিচালনা করতে সক্ষম হওয়া উচিত এবং যেহেতু সমস্ত রেফারেন্স প্রকারগুলি অন্তর্নিহিতভাবে নলযোগ্য হয়, তবে যদি কোনও রেফারেন্স টাইপ বা নাল পাস হয় তবে পদ্ধতিটি সর্বদা সত্য হওয়া উচিত।
উপরের দুটি পদ্ধতি নিম্নলিখিত একক পদ্ধতিতে প্রতিস্থাপন এবং একই আউটপুট অর্জন করতে পারে:
public static bool IsObjectNullable<T>(T obj)
{
Type argType = typeof(T);
if (!argType.IsValueType || obj == null)
return true;
return argType.IsGenericType && argType.GetGenericTypeDefinition() == typeof(Nullable<>);
}
যাইহোক, এই শেষ, একক পদ্ধতি পদ্ধতির সাথে সমস্যা হ'ল কোনও নাল <<> পরামিতি ব্যবহার করা হলে কর্মক্ষমতা ভুগতে হয়। এই একক পদ্ধতির শেষ লাইনটি নির্বাহ করতে অনেক বেশি প্রসেসরের সময় লাগে এটির তুলনায় কমলারটি পূর্বে দেখানো দ্বিতীয় পদ্ধতি ওভারলোড চয়ন করতে দেয় যখন ইসোবজেক্টনুলযোগ্য কলটিতে কোনও নাল <<> টাইপ পরামিতি ব্যবহৃত হয়। সুতরাং, সর্বোত্তম সমাধানটি এখানে বর্ণিত দ্বি-পদ্ধতি পদ্ধতির ব্যবহার করা।
কায়েট: উদাহরণ হিসাবে দেখানো হয়েছে এই পদ্ধতিটি কেবলমাত্র আসল অবজেক্ট রেফারেন্স বা একটি সঠিক অনুলিপি ব্যবহার করে ডাকা হলে নির্ভরযোগ্যভাবে কাজ করে। যাইহোক, যদি কোনও নলযোগ্য বস্তুটি তার মূল নালাম <> ফর্মের পরিবর্তে অন্য প্রকারের (যেমন অবজেক্ট ইত্যাদি) বাক্সযুক্ত হয় তবে এই পদ্ধতিটি নির্ভরযোগ্যভাবে কাজ করবে না। যদি এই পদ্ধতিতে কলিং কোডটি মূল, আনবক্সড অবজেক্ট রেফারেন্স বা একটি সঠিক অনুলিপি ব্যবহার না করে, তবে এই পদ্ধতিটি ব্যবহার করে এটি নির্ভরযোগ্যভাবে অবজেক্টের শূন্যতা নির্ধারণ করতে পারে না।
বেশিরভাগ কোডিং দৃশ্যে, অযোগ্যতা নির্ধারণ করতে তার পরিবর্তে মূল বিষয়টির ধরণের পরীক্ষার উপর নির্ভর করতে হবে, এর উল্লেখটি নয় (উদাহরণস্বরূপ, অযোগ্যতা নির্ধারণের জন্য কোডটির অবশ্যই অবজেক্টের মূল প্রকারের অ্যাক্সেস থাকতে হবে)। এই আরও সাধারণ ক্ষেত্রে, IsTypeNullable (লিঙ্ক দেখুন) নূন্যতা নির্ধারণ করার একটি নির্ভরযোগ্য পদ্ধতি।
পিএস - "nlalability" সম্পর্কে
আমি পৃথক পোস্টে করা নালিয়াযোগ্যতা সম্পর্কে আমার একটি বিবৃতি পুনরাবৃত্তি করা উচিত, যা এই বিষয়টিকে সঠিকভাবে সম্বোধন করার জন্য সরাসরি প্রযোজ্য। এটি হ'ল আমি বিশ্বাস করি যে এখানে কোনও আলোচনার কেন্দ্রবিন্দু হওয়া উচিত নয় যে কোনও বস্তুটি জেনেরিক নালাইবল টাইপ কিনা তা খতিয়ে দেখা উচিত নয়, বরং তার ধরণের কোনও বস্তুর জন্য নালীর কোনও মূল্য নির্ধারণ করা যেতে পারে কিনা তা পরীক্ষা করা উচিত। অন্য কথায়, আমি মনে করি যে আমাদের কোনও নির্ধারণ করা উচিত যে কোনও বস্তুর প্রকার হ্রাসযোগ্য নয়, এটি নলাবদ্ধ কিনা। পার্থক্যটি শব্দার্থবিজ্ঞানের মধ্যে রয়েছে, যথা: ন্যূনযোগ্যতা নির্ধারণের ব্যবহারিক কারণগুলি, যা সাধারণত এটি গুরুত্বপূর্ণ।
রান-টাইম (ওয়েব সার্ভিসেস, রিমোট কল, ডাটাবেসগুলি, ফিডস ইত্যাদির) অবধি অজানা ধরণের অবজেক্টগুলি ব্যবহার করে এমন কোনও সিস্টেমে কোনও সাধারণ প্রয়োজনীয়তা নির্ধারণ করা হয় যে কোনও বস্তুকে নাল বরাদ্দ করা যেতে পারে, বা বস্তুটি থাকতে পারে কিনা একটি নাল অ-অ-প্রসারণযোগ্য ধরণের ক্ষেত্রে এই ধরনের ক্রিয়াকলাপ সম্পাদন করা ত্রুটিগুলি তৈরি করতে পারে, সাধারণত ব্যাতিক্রম হয়, যা কার্য সম্পাদন এবং কোডিং প্রয়োজনীয়তার ক্ষেত্রে উভয়ই ব্যয়বহুল। এই জাতীয় সমস্যাগুলি সক্রিয়ভাবে এড়িয়ে চলার সর্বাধিক পছন্দের পন্থা অবলম্বন করার জন্য, এটি নির্ধারণ করা প্রয়োজন যে কোনও স্বেচ্ছাসেবীর ধরণের কোনও বস্তু নাল যুক্ত করতে সক্ষম কিনা; অর্থাত্, এটি সাধারণত 'nullaable' কিনা।
খুব ব্যবহারিক এবং সাধারণ অর্থে। নেট শর্তাবলীর মধ্যে nullability মোটেই বোঝা যায় না যে কোনও বস্তুর প্রকার নলযোগ্য একটি রূপ। বেশিরভাগ ক্ষেত্রে বস্তুগুলির রেফারেন্সের ধরণ থাকে, এতে নাল মান থাকতে পারে এবং এইভাবে সমস্ত অযোগ্য; এগুলির কোনওটিরই নুলযোগ্য টাইপ নেই। অতএব, বেশিরভাগ পরিস্থিতিতে ব্যবহারিক উদ্দেশ্যে, নল্যাবিলিটির সাধারণ ধারণার জন্য বনাম নূরেবলের বাস্তবায়ন-নির্ভর ধারণার জন্য পরীক্ষা করা উচিত। সুতরাং কেবলমাত্র নেট নেট ন্যালেবল টাইপের দিকে মনোনিবেশ করে আমাদের ঝুলিয়ে রাখা উচিত নয় বরং এর প্রয়োজনীয়তা এবং আচরণ সম্পর্কে আমাদের উপলব্ধিটি ন্যূনযোগ্যতার সাধারণ, বাস্তব ধারণার উপর ফোকাস করার প্রক্রিয়ায় অন্তর্ভুক্ত করা উচিত।