C# Language
नल-संचालक संचालक
खोज…
वाक्य - विन्यास
- var result = possibleNullObject ?? डिफ़ॉल्ट मान;
पैरामीटर
पैरामीटर | विवरण |
---|---|
possibleNullObject | शून्य मान के लिए परीक्षण करने का मान। यदि कोई अशक्त है, तो यह मान लौटाया जाता है। एक अशक्त प्रकार होना चाहिए। |
defaultValue | यदि possibleNullObject तो मान लौटा दिया गया है। possibleNullObject रूप में एक ही प्रकार होना चाहिए NullObject। |
टिप्पणियों
अशक्त coalescing ऑपरेटर ही दो लगातार सवालिया निशान है: ??
यह सशर्त अभिव्यक्ति के लिए एक आशुलिपि है:
possibleNullObject != null ? possibleNullObject : defaultValue
बाईं ओर का ऑपरेंड (ऑब्जेक्ट का परीक्षण किया जा रहा है) एक अशक्त मान प्रकार या संदर्भ प्रकार होना चाहिए, या एक संकलित त्रुटि होगी।
?? ऑपरेटर संदर्भ प्रकार और मूल्य प्रकार दोनों के लिए काम करता है।
मूल उपयोग
null-coalescing operator (??)
का उपयोग करने से आपको एक null-coalescing operator (??)
प्रकार के लिए डिफ़ॉल्ट मान निर्दिष्ट करने की अनुमति मिलती है यदि बाएं हाथ का ऑपरेंड null
।
string testString = null;
Console.WriteLine("The specified string is - " + (testString ?? "not provided"));
यह तार्किक रूप से इसके बराबर है:
string testString = null;
if (testString == null)
{
Console.WriteLine("The specified string is - not provided");
}
else
{
Console.WriteLine("The specified string is - " + testString);
}
या टर्नरी ऑपरेटर (? :) ऑपरेटर का उपयोग कर:
string testString = null;
Console.WriteLine("The specified string is - " + (testString == null ? "not provided" : testString));
अशक्त होकर गिरना और पीछा करना
बाएं हाथ का ऑपरेंड अशक्त होना चाहिए, जबकि राइट-हैंड ऑपरेंड हो सकता है या नहीं। परिणाम उसी के अनुसार टाइप किया जाएगा।
गैर-व्यर्थ
int? a = null;
int b = 3;
var output = a ?? b;
var type = output.GetType();
Console.WriteLine($"Output Type :{type}");
Console.WriteLine($"Output value :{output}");
आउटपुट:
प्रकार: System.Int32
मूल्य: 3
नल
int? a = null;
int? b = null;
var output = a ?? b;
output
टाइप int?
और b
, या null
बराबर है।
एकाधिक तालमेल
श्रृंखला में भी किया जा सकता है:
int? a = null;
int? b = null;
int c = 3;
var output = a ?? b ?? c;
var type = output.GetType();
Console.WriteLine($"Type :{type}");
Console.WriteLine($"value :{output}");
आउटपुट:
प्रकार: System.Int32
मूल्य: 3
नल सशर्त जंजीर
अशक्त सहवर्ती संचालक का उपयोग वस्तुओं के गुणों तक सुरक्षित पहुंच प्रदान करने के लिए अशक्त प्रसार संचालक के साथ मिलकर किया जा सकता है।
object o = null;
var output = o?.ToString() ?? "Default Value";
आउटपुट:
प्रकार: System.String
मान: डिफ़ॉल्ट मान
विधि कॉल के साथ अशक्त सहचालक
अशक्त coalescing ऑपरेटर यह सुनिश्चित करना आसान बनाता है कि एक विधि जो null
वापस आ सकती है वह एक डिफ़ॉल्ट मान पर वापस आ जाएगी।
अशक्त coalescing ऑपरेटर के बिना:
string name = GetName();
if (name == null)
name = "Unknown!";
अशक्त सहकर्मी ऑपरेटर के साथ:
string name = GetName() ?? "Unknown!";
मौजूदा का उपयोग करें या नया बनाएँ
एक सामान्य उपयोग परिदृश्य जो इस सुविधा के साथ वास्तव में मदद करता है, जब आप एक संग्रह में एक वस्तु की तलाश कर रहे हैं और एक नया बनाने की आवश्यकता है अगर यह पहले से मौजूद नहीं है।
IEnumerable<MyClass> myList = GetMyList();
var item = myList.SingleOrDefault(x => x.Id == 2) ?? new MyClass { Id = 2 };
आलसी गुण संचालक शून्य coalescing संचालक के साथ
private List<FooBar> _fooBars;
public List<FooBar> FooBars
{
get { return _fooBars ?? (_fooBars = new List<FooBar>()); }
}
पहली बार संपत्ति .FooBars
पहुँचा जा सकता है _fooBars
चर के रूप में मूल्यांकन करेंगे null
, इस प्रकार काम बयान प्रदान करती है और जिसके परिणामस्वरूप मूल्य का मूल्यांकन करने के लिए के माध्यम से गिरने।
धागा सुरक्षा
यह आलसी गुणों को लागू करने का धागा-सुरक्षित तरीका नहीं है । थ्रेड-सुरक्षित आलस्य के लिए, .NET फ्रेमवर्क में निर्मित Lazy<T>
वर्ग का उपयोग करें।
अभिव्यक्ति निकायों का उपयोग करते हुए सी # 6 सिंथेटिक शुगर
ध्यान दें कि C # 6 के बाद से, संपत्ति के लिए अभिव्यक्ति निकाय का उपयोग करके इस वाक्यविन्यास को सरल बनाया जा सकता है:
private List<FooBar> _fooBars;
public List<FooBar> FooBars => _fooBars ?? ( _fooBars = new List<FooBar>() );
इसके बाद संपत्ति तक पहुँच _fooBars
चर में संग्रहीत मान प्राप्त करेगा।
MVVM पैटर्न में उदाहरण
इसका उपयोग अक्सर MVVM पैटर्न में कमांड को लागू करते समय किया जाता है। एक दृश्यदर्शी के निर्माण के साथ उत्सुकता से आदेशों को शुरू करने के बजाय, इस पैटर्न का उपयोग करके आदेशों को प्रारंभिक रूप से आरंभ किया जाता है:
private ICommand _actionCommand = null;
public ICommand ActionCommand =>
_actionCommand ?? ( _actionCommand = new DelegateCommand( DoAction ) );