উত্তর:
এটি নাল কন্ডিশনাল অপারেটর। এর মূল অর্থ:
"প্রথম অপারেন্ডকে মূল্যায়ন করুন; যদি তা শূন্য হয়, তবে নালার ফলস্বরূপ বন্ধ করুন Otherwise অন্যথায়, দ্বিতীয় অপারেন্ডকে মূল্যায়ন করুন (প্রথম অপারেন্ডের সদস্য হিসাবে)
আপনার উদাহরণস্বরূপ, বিন্দুটি হ'ল যদি 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";
ডটনেটফিডাল.নেট ওয়ার্কিং উদাহরণ ।
( ?? বা নাল-কোয়ালেসিং অপারেটর থেকে ভিন্ন ? বা নাল শর্তসাপেক্ষ অপারেটর )।
এটি অ্যাকশন সহ অ্যাসাইনমেন্ট অপারেটরগুলির পক্ষেও ব্যবহার করা যেতে পারে। পরিবর্তে
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");
}
}
ফলাফল:
পরীক্ষা 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 # এর কাছে নতুন নাল বা অ- নাল পদ্ধতি chaining মান।
একই জিনিস অর্জনের পুরানো উপায় ছিল:
var functionCaller = this.member;
if (functionCaller!= null)
functionCaller.someFunction(var someParam);
এবং এখন এটি কেবলমাত্র দিয়ে আরও সহজ করা হয়েছে:
member?.someFunction(var someParam);
আমি আপনাকে এখানে এটি পড়ার জন্য দৃ read়ভাবে পরামর্শ দিচ্ছি: