সি # ক্লাসে একটি প্যাটার্ন রয়েছে যার দ্বারা অনুকরণীয় : Dictionary.TryGetValueএবং int.TryParseএমন একটি পদ্ধতি যা একটি বুলিয়ান প্রদান করে যা অপারেশনের সাফল্য এবং আসল ফলাফল সহ একটি আউট প্যারামিটার নির্দেশ করে; যদি অপারেশন ব্যর্থ হয় তবে আউট প্যারামিটারটি বাতিল হয়ে যায়।
ধরে নেওয়া যাক আমি সি # 8 নন-অযোগ্য রেফারেন্স ব্যবহার করছি এবং আমার নিজের ক্লাসের জন্য ট্রাইপার্স পদ্ধতি লিখতে চাই। সঠিক স্বাক্ষর হল:
public static bool TryParse(string s, out MyClass? result);
ফলটি মিথ্যা ক্ষেত্রে নালার কারণে আউট ভেরিয়েবলকে অবশ্যই নাল হিসাবে চিহ্নিত করতে হবে।
যাইহোক, চেষ্টা প্যাটার্নটি সাধারণত এটির মতো ব্যবহৃত হয়:
if (MyClass.TryParse(s, out var result))
{
// use result here
}
যেহেতু আমি কেবল তখন শাখায় প্রবেশ করি যখন অপারেশন সফল হয়, ফলাফলটি কখনই সেই শাখায় শূন্য হয় না। তবে যেহেতু আমি এটিকে অযোগ্য হিসাবে চিহ্নিত করেছি, এখন আমাকে তা পরীক্ষা করতে হবে বা !ওভাররাইডের জন্য ব্যবহার করতে হবে:
if (MyClass.TryParse(s, out var result))
{
Console.WriteLine("Look: {0}", result.SomeProperty); // compiler warning, could be null
Console.WriteLine("Look: {0}", result!.SomeProperty); // need override
}
এটি কুৎসিত এবং কিছুটা অপ্রয়োজনীয়।
সাধারণ ব্যবহারের ধরণটির কারণে আমার কাছে আরও একটি বিকল্প রয়েছে: ফলাফলের প্রকারটি সম্পর্কে মিথ্যা বলা:
public static bool TryParse(string s, out MyClass result) // not nullable
{
// Happy path sets result to non-null and returns true.
// Error path does this:
result = null!; // override compiler complaint
return false;
}
এখন সাধারণ ব্যবহার সুন্দর হয়ে উঠেছে:
if (MyClass.TryParse(s, out var result))
{
Console.WriteLine("Look: {0}", result.SomeProperty); // no warning
}
কিন্তু অ্যাটিক্যাল ব্যবহারের সতর্কতাটি এটি পায় না:
else
{
Console.WriteLine("Fail: {0}", result.SomeProperty);
// Yes, result is in scope here. No, it will never be non-null.
// Yes, it will throw. No, the compiler won't warn about it.
}
এখন আমি কোন পথে যাব তা নিশ্চিত নই। সি # ভাষা দল থেকে কোনও অফিসিয়াল সুপারিশ রয়েছে কি? ইতিমধ্যে এমন কোনও কোরএফএক্স কোড কি অ-অযোগ্য রেফারেন্সে রূপান্তরিত হয়েছে যা আমাকে কীভাবে এটি করতে পারে তা দেখিয়ে দিতে পারে? (আমি TryParseপদ্ধতিগুলি অনুসন্ধান করতে গিয়েছিলাম । IPAddressএটি একটি শ্রেণি যা একটি রয়েছে তবে এটি কোরফেক্সের মাস্টার শাখায় রূপান্তরিত হয়নি))
এবং জেনেরিক কোড এর Dictionary.TryGetValueসাথে কীভাবে ডিল করে? ( MaybeNullআমি যা পেয়েছি তার থেকে সম্ভবত একটি বিশেষ বৈশিষ্ট্যযুক্ত।) আমি যখন Dictionaryকোনও অ-অযোগ্য মান ধরণের দিয়ে ইনস্ট্যান্ট করি তখন কী হয় ?
MyClass?আসুন, এবং এcase MyClass myObj:এবং (একটি বিকল্প) দিয়ে এটিতে একটি স্যুইচ করুনcase null:।