প্রশ্ন চিহ্ন এবং ডট অপারেটর কি করে? সি # 6.0 এর মানে?


359

ভিএস ২০১৫ পূর্বরূপে সি # 6.০ সহ আমাদের একটি নতুন অপারেটর রয়েছে ?., যা এটি এর মতো ব্যবহার করা যেতে পারে:

public class A {
   string PropertyOfA { get; set; }
}

...

var a = new A();
var foo = "bar";
if(a?.PropertyOfA != foo) {
   //somecode
}

ঠিক এটা কী কাজ করে?

উত্তর:


499

এটি নাল কন্ডিশনাল অপারেটর। এর মূল অর্থ:

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

8
একে কি নাল কন্ডিশনাল অপারেটর বলা হয় না ?
স্ল্যাक्स

1
@ এসলাক্স: আমি ভেবেছিলাম এটি "শর্তসাপেক্ষ নাল" তবে আমি ভুল হতে পারি। গতবার আমি রোজলিন ভাষার বৈশিষ্ট্যযুক্ত ডক্সটি পরীক্ষা করেছিলাম, এটির নামও রাখা হয়নি। হতে পারে উত্সটি এখানে কর্তৃপক্ষ - পরীক্ষা করবে।
জন স্কিটি 5'15

3
@ এসএলক্স: অবশ্যই সিনট্যাক্স কিন্ডে এটি দৃশ্যত শর্তসাপেক্ষ অ্যাক্সেস এক্সপ্রেসন যা বিরক্তিকরভাবে তাদের মধ্যেও নয় ...
জন স্কিচ

12
আমি "এলভিস" অপারেটরটির নামটি পছন্দ করেছি: পি
আহমেদ ইলিয়াস

3
কেবলমাত্র রেকর্ডের জন্য আমি এই অপারেটরের পাঁচটি পৃথক নাম দেখেছি: নিরাপদ নেভিগেশন, নাল-শর্তসাপেক্ষ, নাল প্রচার, শর্তাধীন অ্যাক্সেস, এলভিস।
গিগি

81

শ্রেণিবিন্যাস এবং / অথবা ম্যাপিং অবজেক্টগুলিকে সমতল করার সময় এটি খুব কার্যকর হতে পারে। পরিবর্তে:

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


27
লোককে বাঁচাতে কি দেখছেন ?? এটি .. এটি নাল-কোলেসিং অপারেটর এবং এটি শূন্য না হলে নামটি ফিরিয়ে দেবে, অন্যথায় এটি "এন / এ" ফিরে আসবে।
স্টিভ

6
@Erik ফিলিপস আমি মনে করি আপনি যোগ করতে হবে || Model.Model2.Model3.Model4.Name == null কেস অন্যথায় একই লজিক আছে, Model.Model2.Model3.Model4.Nameহয় null, mapped.Nameথাকবোnull
RazvanR

2
আমার অনুমান অনুসারে একই পৃষ্ঠায় @ এরিক ফিলিপস নেই। আপনার উভয় ক্ষেত্রে যদি Model.Model2.Model3.Model4.Nameহয় তবে তা দেখার চেষ্টা করুন null
রাজ্জানআর

1
ফলাফলটি "এন / এ", আবার প্রথম মন্তব্য পড়ুন দয়া করে। ডটনেটফিডাল.নেট ওয়ার্কিং উদাহরণ
এরিক ফিলিপস

7
@ এরিক ফিলিপস: এটির প্রথম মন্তব্যের সাথে আমাদের কিছু করার নেই, কারণ এটি আপনার প্রথম উদাহরণের সাথে সম্পর্কিত নয়। elseএটিতে আপনি ব্রাঞ্চে ঝাঁপিয়ে পড়তেন এবং থাকবেন mapped.Name = Model.Model2.Model3.Model4.Name -> mapped.Name = null, যখন আপনি দ্বিতীয় উদাহরণটি ব্যবহার করবেন mapped.Name = "N/A"। দেখুন সম্পাদিত DotNetFiddle
Derm

3

এই যা সহজ করে তোলে আমাদের কাছে সম্মানের সঙ্গে ফাংশান কল করার জন্য অপেক্ষাকৃত C # এর কাছে নতুন নাল বা অ- নাল পদ্ধতি chaining মান।

একই জিনিস অর্জনের পুরানো উপায় ছিল:

var functionCaller = this.member;
if (functionCaller!= null)
    functionCaller.someFunction(var someParam);

এবং এখন এটি কেবলমাত্র দিয়ে আরও সহজ করা হয়েছে:

member?.someFunction(var someParam);

আমি আপনাকে এখানে এটি পড়ার জন্য দৃ read়ভাবে পরামর্শ দিচ্ছি:

https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/operators/null-conditional-operators

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.