सी # वर्गों में एक पैटर्न है, जिसके द्वारा अनुकरण किया गया है Dictionary.TryGetValue
और int.TryParse
: एक विधि जो एक ऑपरेशन की सफलता का संकेत देती है और वास्तविक परिणाम वाले एक आउट पैरामीटर है; यदि ऑपरेशन विफल हो जाता है, तो आउट पैरामीटर को शून्य पर सेट किया जाता है।
मान लेते हैं कि मैं C # 8 गैर-अशक्त संदर्भों का उपयोग कर रहा हूं और अपने स्वयं के वर्ग के लिए एक TryParse विधि लिखना चाहता हूं। सही हस्ताक्षर यह है:
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.
}
अब मुझे यकीन नहीं है कि यहां कौन सा रास्ता जाना है। क्या सी # भाषा टीम की आधिकारिक सिफारिश है? क्या कोई CoreFX कोड पहले से ही गैर-अशांत संदर्भों में परिवर्तित हो गया है जो मुझे दिखा सकता है कि यह कैसे करना है? (मैं TryParse
तरीकों की तलाश में गया था । IPAddress
एक वर्ग है जिसमें एक है, लेकिन इसे कोरफैक्स की मास्टर शाखा में परिवर्तित नहीं किया गया है)
और इससे Dictionary.TryGetValue
निपटने के लिए सामान्य कोड कैसे होता है ? (संभवतः एक विशेष MaybeNull
विशेषता के साथ जो मैंने पाया है।) क्या होता है जब मैं Dictionary
एक गैर-अशक्त मान प्रकार के साथ त्वरित करता हूं ?
MyClass?
), और एकcase MyClass myObj:
(एक विकल्प) के साथ उस पर एक स्विच करेंcase null:
।