c# - দুটি প্রশ্ন চিহ্ন একসঙ্গে সি#মানে কি?




null-coalescing-operator (11)

কোড এই লাইন জুড়ে রান:

FormsAuth = formsAuth ?? new FormsAuthenticationWrapper();

দুই প্রশ্ন চিহ্ন কি মানে, এটা কোন ধরনের টার্নারি অপারেটর? এটা গুগল সন্ধান করা কঠিন।


বিঃদ্রঃ:

আমি এই থ্রেড এবং অনেক অন্যদের সম্পূর্ণ পড়া আছে কিন্তু এই হিসাবে আমি পুঙ্খানুপুঙ্খ উত্তর হিসাবে খুঁজে পাচ্ছি না।

যার দ্বারা আমি পুরোপুরি বুঝতে পেরেছি "কেন ব্যবহার করবেন ?? এবং কখন ব্যবহার করবেন ?? এবং কিভাবে ব্যবহার করবেন ??"

সূত্র:

ক্রেইগ ম্যাকমার্টরি দ্বারা প্রকাশিত উইন্ডোজ কমিউনিকেশন ফাউন্ডেশন ISBN 0-672-32948-4

নুন্যাল মান টাইপ

দুটি সাধারণ পরিস্থিতি রয়েছে যার মধ্যে একটি জানতে হবে যে কোনও মানটি একটি মান টাইপের উদাহরণ দেওয়া হয়েছে কিনা। প্রথমটি যখন একটি ডাটাবেস একটি মান প্রতিনিধিত্ব করে। এই ক্ষেত্রে, একটি ডাটাবেসের মধ্যে প্রকৃতপক্ষে একটি মান প্রকৃতপক্ষে উপস্থিত কিনা তা নির্ধারণ করতে একটি উদাহরণ পরীক্ষা করতে সক্ষম হতে চাই। অন্য পরিস্থিতিতে, যা এই বইয়ের বিষয়টিকে আরও প্রাসঙ্গিক বলে মনে করা হয়, যখন উদাহরণটি কিছু দূরবর্তী উত্স থেকে প্রাপ্ত তথ্য আইটেমটি উপস্থাপন করে। আবার, একটি উদাহরণ থেকে নির্ধারণ করতে চান যে তথ্য আইটেমের জন্য একটি মান প্রাপ্ত হয়েছে কিনা।

.NET ফ্রেমওয়ার্ক 2.0 একটি জেনেরিক টাইপ সংজ্ঞা অন্তর্ভুক্ত করে যা এই ধরনের ক্ষেত্রে সরবরাহ করে যার মধ্যে একটি মান টাইপের উদাহরণটি নিল বরাদ্দ করতে চায় এবং পরীক্ষা করে দেখুন যে উদাহরণটির মানটি নাল। জেনেরিক টাইপ সংজ্ঞাটি System.Nullable, যা জেনারিক টাইপ আর্গুমেন্টগুলিকে বাধা দেয় যা টি থেকে মানের জন্য প্রতিস্থাপিত হতে পারে। সিস্টেম Nullable থেকে নির্মিত ধরনের উদাহরণ নল একটি মান বরাদ্দ করা যেতে পারে; প্রকৃতপক্ষে, তাদের মান ডিফল্টরূপে নিল। সুতরাং, সিস্টেম Nullable থেকে নির্মিত ধরনের nullable মান ধরনের হিসাবে উল্লেখ করা যেতে পারে। System.Nullable এর একটি সম্পত্তি, মান, যার দ্বারা এটি তৈরি করা একটি উদাহরণের একটি উদাহরণের জন্য নির্ধারিত মানটি পাওয়া যেতে পারে যদি ইনস্ট্যান্সের মান নল না হয়। অতএব, একজন লিখতে পারেন:

System.Nullable<int> myNullableInteger = null;
myNullableInteger = 1;
if (myNullableInteger != null)
{
Console.WriteLine(myNullableInteger.Value);
}

সি # প্রোগ্রামিং ভাষাটি System.Nullable থেকে তৈরি ধরনের ঘোষণার জন্য একটি সংক্ষেপিত সিনট্যাক্স সরবরাহ করে। যে সিনট্যাক্স এক সংক্ষিপ্ত করতে পারবেন:

System.Nullable<int> myNullableInteger;

থেকে

int? myNullableInteger;

কম্পাইলারটি একটি অসম্পূর্ণ মানের প্রকারের মানটিকে এইভাবে একটি সাধারণ মান প্রকারে বরাদ্দ করার প্রচেষ্টা থেকে বাধা দেবে:

int? myNullableInteger = null;
int myInteger = myNullableInteger;

এটি এমনটি করতে এটিকে বাধা দেয় কারণ দ্রষ্টব্য মানের ধরণটি মান নাল থাকতে পারে, এটি আসলে এই ক্ষেত্রে থাকবে এবং এটি যে মানটি সাধারণ মান টাইপের জন্য বরাদ্দ করা যাবে না। যদিও কম্পাইলার এই কোড অনুমতি দেবে,

int? myNullableInteger = null;
int myInteger = myNullableInteger.Value;

System.Nullable.Value সম্পত্তির অ্যাক্সেসের যেকোন প্রচেষ্টাটি যদি System.ullullable থেকে নির্মিত টাইপটির বৈধ মান নির্ধারিত না হয় তবে দ্বিতীয় বিবৃতিটি একটি ব্যতিক্রমকে নিক্ষেপ করা হবে কারণ এতে এটি ঘটেনি। কেস।

উপসংহার:

একটি সাধারণ মান টাইপের একটি নলযোগ্য মান টাইপের মান নির্ধারণ করার একটি সঠিক উপায় হল T. এর বৈধ মানটি নুন্যযোগ্য মান টাইপের জন্য বরাদ্দ করা হয়েছে কিনা তা নির্ধারণ করতে সিস্টেম.Nullable.HasValuue সম্পত্তিটি ব্যবহার করা হল:

int? myNullableInteger = null;
if (myNullableInteger.HasValue)
{
int myInteger = myNullableInteger.Value;
}

আরেকটি বিকল্প এই সিনট্যাক্স ব্যবহার করা হয়:

int? myNullableInteger = null;
int myInteger = myNullableInteger ?? -1;

যার মাধ্যমে সাধারণ পূর্ণসংখ্যা myInteger নূন্যতম পূর্ণসংখ্যাটির মান "myNullableInteger" নির্ধারণ করা হয় যদি পরবর্তীটিকে বৈধ পূর্ণসংখ্যা মান নির্ধারণ করা হয়; অন্যথায়, MyInteger মান -1 বরাদ্দ করা হয়।


"নল কোলেসেসিং অপারেটর" ( ?? ) এর বেশিরভাগ উত্তরগুলিতে সঠিকভাবে উল্লেখ করা হয়েছে, যার বিষয়ে আপনি তার চাচাতো ভাইকে "নল-শর্তাধীন অপারেটর" ( ?। অনেক বার এটি সঙ্গে ব্যবহার করা হয় ??

নল-শর্তাধীন অপারেটর

একটি সদস্য অ্যাক্সেস ( ?। ) বা সূচী ( ? [ ) অপারেশন সম্পাদন করার আগে নাল জন্য পরীক্ষা করতে ব্যবহৃত হয়। এই অপারেটর আপনাকে নকল চেকগুলি পরিচালনা করতে কম কোড লিখতে সহায়তা করে, বিশেষ করে ডেটা কাঠামোর মধ্যে নেমে যাওয়ার জন্য।

উদাহরণ স্বরূপ:

// if 'customers' or 'Order' property or 'Price' property  is null,
// dollarAmount will be 0 
// otherwise dollarAmount will be equal to 'customers.Order.Price'

int dollarAmount = customers?.Order?.Price ?? 0; 

ছাড়া পুরানো উপায় ? এবং ?? এই কাজ করা হয়

int dollarAmount = customers != null 
                   && customers.Order!=null
                   && customers.Order.Price!=null 
                    ? customers.Order.Price : 0; 

যা আরো verbose এবং কষ্টকর।


এই সম্পর্কে বিপজ্জনক কিছুই। আসলে, এটা সুন্দর। আপনি যদি ডিফল্ট মানটি যুক্ত করতে পারেন তবে উদাহরণস্বরূপ:

কোড

int x = x1 ?? x2 ?? x3 ?? x4 ?? 0;

এটা টার্নারি অপারেটর জন্য সংক্ষিপ্ত হাত।

FormsAuth = (formsAuth != null) ? formsAuth : new FormsAuthenticationWrapper();

অথবা যারা ত্রৈমাসিক না জন্য:

if (formsAuth != null)
{
  FormsAuth = formsAuth;
}
else
{
  FormsAuth = new FormsAuthenticationWrapper();
}

এটি নিল কোলাসিং অপারেটর এবং বেশিরভাগ টার্নারি (অবিলম্বে-যদি) অপারেটরের মত। আরও দেখুন ?? অপারেটর - এমএসডিএন

FormsAuth = formsAuth ?? new FormsAuthenticationWrapper();

প্রসারিত:

FormsAuth = formsAuth != null ? formsAuth : new FormsAuthenticationWrapper();

যা আরও প্রসারিত:

if(formsAuth != null)
    FormsAuth = formsAuth;
else
    FormsAuth = new FormsAuthenticationWrapper();

ইংরেজীতে, এর অর্থ "যদি বাম দিকে যা থাকে তা নাল না হয়, তবে সেটি ব্যবহার করুন, অন্যথায় যা সঠিক তা ব্যবহার করুন।"

আপনি ক্রম এই যে কোন সংখ্যা ব্যবহার করতে পারেন মনে রাখবেন। নিম্নোক্ত বিবৃতি Answer# দেওয়ার জন্য প্রথম অ-উত্তরহীন Answer# বরাদ্দ করবে (যদি সমস্ত উত্তর নাল থাকে তবে Answer নিল হয়):

string Answer = Answer1 ?? Answer2 ?? Answer3 ?? Answer4;

এছাড়াও উপরে উল্লিখিত ধারণাটি সমানভাবে সমানভাবে উল্লেখযোগ্য, প্রতিটি অভিব্যক্তিটির ফলাফল একবার একবার মূল্যায়ন করা হয়। উদাহরণস্বরূপ একটি অভিব্যক্তি পার্শ্ব প্রতিক্রিয়া সঙ্গে একটি পদ্ধতি কল হয় এটি গুরুত্বপূর্ণ। (@ জয়ের কাছে ক্রেডিট করার জন্য এটি নির্দেশ করুন।)


এটি নিল কোলাসিং অপারেটর।

http://msdn.microsoft.com/en-us/library/ms173224.aspx

হ্যাঁ, এটি সন্ধান করা প্রায় অসম্ভব না যতক্ষণ না আপনি এটি কি বলা হয়! :-)

সম্পাদনা করুন: এবং এটি অন্য একটি প্রশ্ন থেকে একটি শীতল বৈশিষ্ট্য। আপনি তাদের চেন করতে পারেন।

সি # লুকানো বৈশিষ্ট্য?


ধন্যবাদ সবাই, এমএসডিএন সাইটে পাওয়া সবচেয়ে সংক্ষিপ্ত ব্যাখ্যা এখানে পাওয়া যায়:

// y = x, unless x is null, in which case y = -1.
int y = x ?? -1;

যদি আপনি রুবি পরিচিত হন, তার ||= সি # এর মত মনে হয় ?? আমাকে. এখানে কিছু রুবি আছে:

irb(main):001:0> str1 = nil
=> nil
irb(main):002:0> str1 ||= "new value"
=> "new value"
irb(main):003:0> str2 = "old value"
=> "old value"
irb(main):004:0> str2 ||= "another new value"
=> "old value"
irb(main):005:0> str1
=> "new value"
irb(main):006:0> str2
=> "old value"

এবং সি #:

string str1 = null;
str1 = str1 ?? "new value";
string str2 = "old value";
str2 = str2 ?? "another new value";

শুধুমাত্র আপনার পরিতোষ জন্য (বুদ্ধিমান আপনি সব সি # ছেলেরা ;-)।

আমার মনে হয় এটি স্মলটক-এ জন্মগ্রহণ করেছে, যেখানে এটি বহু বছর ধরে চলছে। এটি হিসাবে সংজ্ঞায়িত করা হয়:

বস্তুর মধ্যে:

? anArgument
    ^ self

অনির্ধারিত বস্তু (আকা nil এর বর্গ):

? anArgument
    ^ anArgument

উভয় মূল্যায়ন (?) এবং অ মূল্যায়ন সংস্করণ (??) এর আছে।
এটি প্রায়ই অলস-প্রারম্ভিক ব্যক্তিগত (দৃষ্টান্ত) ভেরিয়েবলগুলির জন্য গেট-পদ্ধতিতে পাওয়া যায়, যা প্রকৃতপক্ষে প্রয়োজন না হওয়া পর্যন্ত বাকি থাকে।


?? মান নল যখন একটি nullable টাইপ জন্য একটি মান প্রদান করার আছে। সুতরাং, যদি ফর্মআউট নাল হয় তবে এটি নতুন ফর্মসঅনুষ্ঠানিকীকরণপ্রেপার () কে ফিরিয়ে দেবে।


FormsAuth = formsAuth ?? new FormsAuthenticationWrapper();

সমতুল্য

FormsAuth = formsAuth != null ? formsAuth : new FormsAuthenticationWrapper();

কিন্তু এটি সম্পর্কে শীতল জিনিস আপনি তাদের চেন করতে পারেন, অন্যান্য মানুষের মত। একটি পাতলা স্পর্শ না যে আপনি আসলে একটি ব্যতিক্রম নিক্ষেপ এটি ব্যবহার করতে পারেন।

A = A ?? B ?? throw new Exception("A and B are both NULL");




null-coalescing-operator