जवाबों:
यह अशक्त सशर्त संचालक है। इसका मूल रूप से मतलब है:
"पहले ऑपरेंड का मूल्यांकन करें; यदि यह अशक्त है, तो शून्य के परिणामस्वरूप बंद करो। अन्यथा, दूसरे ऑपरेंड (पहले ऑपरेंड के एक सदस्य की पहुंच के रूप में) का मूल्यांकन करें।"
आपके उदाहरण में, मुद्दा यह है कि यदि a
है null
, तो एक अपवाद को फेंकने के बजाय a?.PropertyOfA
मूल्यांकन करेगा null
- यह तब उस null
संदर्भ की तुलना करेगा foo
(स्ट्रिंग के ==
अधिभार का उपयोग करके ), यह पता लगाएं कि वे समान नहीं हैं और निष्पादन if
विवरण के शरीर में जाएगा। ।
दूसरे शब्दों में, यह इस तरह है:
string bar = (a == null ? null : a.PropertyOfA);
if (bar != foo)
{
...
}
... इसके अलावा a
केवल एक बार मूल्यांकन किया जाता है।
ध्यान दें कि यह अभिव्यक्ति के प्रकार को भी बदल सकता है। उदाहरण के लिए, विचार करें FileInfo.Length
। यह एक प्रकार की संपत्ति है long
, लेकिन यदि आप इसे शून्य सशर्त ऑपरेटर के साथ उपयोग करते हैं, तो आप प्रकार की अभिव्यक्ति के साथ समाप्त होते हैं long?
:
FileInfo fi = ...; // fi could be null
long? length = fi?.Length; // If fi is null, length will be null
एक पदानुक्रम और / या मानचित्रण वस्तुओं को समतल करते समय यह बहुत उपयोगी हो सकता है। के बजाय:
if (Model.Model2 == null
|| Model.Model2.Model3 == null
|| Model.Model2.Model3.Model4 == null
|| Model.Model2.Model3.Model4.Name == null)
{
mapped.Name = "N/A"
}
else
{
mapped.Name = Model.Model2.Model3.Model4.Name;
}
इसे लिखा जा सकता है (ऊपर जैसा तर्क)
mapped.Name = Model.Model2?.Model3?.Model4?.Name ?? "N/A";
DotNetFiddle.Net कार्य उदाहरण ।
( ?? या नल-वालों ऑपरेटर से अलग है ? या नल सशर्त ऑपरेटर )।
यह भी कार्रवाई के साथ काम ऑपरेटरों के बाहर इस्तेमाल किया जा सकता है। के बजाय
Action<TValue> myAction = null;
if (myAction != null)
{
myAction(TValue);
}
इसे सरल बनाया जा सकता है:
myAction?.Invoke(TValue);
सिस्टम का उपयोग;
public class Program
{
public static void Main()
{
Action<string> consoleWrite = null;
consoleWrite?.Invoke("Test 1");
consoleWrite = (s) => Console.WriteLine(s);
consoleWrite?.Invoke("Test 2");
}
}
परिणाम:
परीक्षण २
|| Model.Model2.Model3.Model4.Name == null
एक ही तर्क जोड़ने की आवश्यकता है , अन्यथा मामले Model.Model2.Model3.Model4.Name
में null
, mapped.Name
रहेगाnull
Model.Model2.Model3.Model4.Name
है null
।
else
-ब्रांच में कूदेंगे और आपके पास mapped.Name = Model.Model2.Model3.Model4.Name -> mapped.Name = null
दूसरा उदाहरण होगा mapped.Name = "N/A"
। देखें संपादित DotNetFiddle
यह C # के लिए अपेक्षाकृत नया है, जो हमारे लिए कार्यप्रणाली में अशक्त या गैर-शून्य मूल्यों के संबंध में फ़ंक्शन को कॉल करना आसान बनाता है ।
उसी चीज़ को हासिल करने का पुराना तरीका था:
var functionCaller = this.member;
if (functionCaller!= null)
functionCaller.someFunction(var someParam);
और अब इसे बहुत आसान बना दिया गया है:
member?.someFunction(var someParam);
मैं आपको इसे यहाँ पढ़ने की जोरदार सलाह देता हूँ: