উত্তর:
এটি নাল কন্ডিশনাল অপারেটর। এর মূল অর্থ:
"প্রথম অপারেন্ডকে মূল্যায়ন করুন; যদি তা শূন্য হয়, তবে নালার ফলস্বরূপ বন্ধ করুন 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়ভাবে পরামর্শ দিচ্ছি: