কোডের এই লাইনটি পেরিয়ে গেল:
FormsAuth = formsAuth ?? new FormsAuthenticationWrapper();
দুটি প্রশ্ন চিহ্নের অর্থ কী, এটি কোনও ধরণের টেরিনারি অপারেটর? গুগলে সন্ধান করা শক্ত।
কোডের এই লাইনটি পেরিয়ে গেল:
FormsAuth = 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;
উপরের সম্প্রসারণটি ধারণাগতভাবে সমতুল্য হওয়ার সাথে সাথে এটি উল্লেখ করার মতো, প্রতিটি অভিব্যক্তির ফলাফল কেবল একবারই মূল্যায়ন করা হয়। এটি গুরুত্বপূর্ণ যদি উদাহরণস্বরূপ কোনও অভিব্যক্তি হল পার্শ্ব প্রতিক্রিয়া সহ একটি পদ্ধতি কল। (এটি নির্দেশ করার জন্য @ জোয়াকে ক্রেডিট।)
??
বাকী, তাই a ?? b ?? c ?? d
সমান ((a ?? b) ?? c ) ?? d
। "অ্যাসাইনমেন্ট অপারেটর এবং টেরিনারি অপারেটর (? :) ডান অ্যাসোসিয়েটিভ other অন্য সমস্ত বাইনারি অপারেটর বাম মিশ্রণমূলক।" সূত্র: এমএসডিএন.মাইক্রোসফটকম /en-us/library/ms173145.aspx
অন্য কেউ এখনও ম্যাজিক শব্দটি বলেন নি কারণ: এটি নাল কোলেসিং অপারেটর । এটি সি # 3.0 ভাষার স্পেসিফিকেশনের 7.12 বিভাগে সংজ্ঞায়িত করা হয়েছে ।
এটি খুব সহজ, বিশেষত এটি যখন কোনও অভিব্যক্তিতে একাধিকবার ব্যবহৃত হয় তখন এটি কাজ করে works ফর্ম একটি অভিব্যক্তি:
a ?? b ?? c ?? d
অভিব্যক্তির ফলাফল a
যদি এটি শূন্য হয় না, অন্যথায় চেষ্টা করুন b
, অন্যথায় চেষ্টা করুন c
, অন্যথায় চেষ্টা করুন d
। এটি প্রতিটি পয়েন্টে শর্ট সার্কিট।
এছাড়াও, প্রকারটি d
যদি অ-অযোগ্য হয় তবে সম্পূর্ণ এক্সপ্রেশনটির ধরণটিও অ-শুরুর।
এটি নাল কোলেসিং অপারেটর।
http://msdn.microsoft.com/en-us/library/ms173224.aspx
হ্যাঁ, এটি কী বলা হয় তা না জানলে অনুসন্ধান করা প্রায় অসম্ভব! :-)
সম্পাদনা: এবং এটি অন্য প্রশ্নের একটি দুর্দান্ত বৈশিষ্ট্য। আপনি তাদের চেইন করতে পারেন।
সবাইকে ধন্যবাদ, এমএসডিএন সাইটে আমি সর্বাধিক সংক্ষিপ্ত ব্যাখ্যাটি পেয়েছি:
// y = x, unless x is null, in which case y = -1.
int y = x ?? -1;
-1
এটি কেবল একটি সমতল int
, যা অযোগ্য) n
x
টাইপ হয় int?
তবে y
টাইপ হয় int
, আপনি লিখতে পারতেন int y = (int)(x ?? -1)
। এটা তোলে পার্স হবে x
একটি করতে int
যদি না হয় তাহলে null
, বা দায়িত্ব অর্পণ -1
করা y
যদি x
হয় null
।
দুটি প্রশ্ন চিহ্ন (??) ইঙ্গিত করে যে এটি একটি কোলেসিং অপারেটর।
Coalescing অপারেটর একটি চেইন থেকে প্রথম NON-NULL মান প্রদান করে। আপনি এই ইউটিউব ভিডিওটি দেখতে পারবেন যা পুরো জিনিসটি ব্যবহারিকভাবে প্রদর্শন করে।
তবে ভিডিওটি যা বলেছে তাতে আমাকে আরও যুক্ত করতে দিন।
যদি আপনি coalescing এর ইংরেজী অর্থ দেখতে পান তবে এটি "একত্রে একত্রিত করা" বলে। উদাহরণস্বরূপ নীচে একটি সাধারণ কোলেসিং কোড যা চারটি স্ট্রিং চেইন করে।
সুতরাং যদি এটি str1
হয় তবে null
এটি চেষ্টা করবে str2
, যদি str2
হয় তবে null
এটি চেষ্টা করবে str3
এবং যতক্ষণ না এটি একটি নন-নাল মান সহ একটি স্ট্রিং খুঁজে না পায়।
string final = str1 ?? str2 ?? str3 ?? str4;
সহজ কথায় কোলেসিং অপারেটর একটি চেইন থেকে প্রথম NON-NULL মান প্রদান করে।
এটি টার্নারি অপারেটরের পক্ষে সংক্ষিপ্ত হাত।
FormsAuth = (formsAuth != null) ? formsAuth : new FormsAuthenticationWrapper();
বা যারা তিনটি কাজ করেন না তাদের জন্য:
if (formsAuth != null)
{
FormsAuth = formsAuth;
}
else
{
FormsAuth = new FormsAuthenticationWrapper();
}
!= null
) এবং দ্বিতীয় formsAuth
(পরে ) উভয়ই ?
পরিবর্তন করা যেতে পারে; নাল একত্রিত আকারে, উভয়ই স্পষ্টভাবে আপনার সরবরাহিত মানগুলি গ্রহণ করে।
আপনি যদি রুবির সাথে পরিচিত হন তবে এটি আমার ||=
কাছে সি # এর অনুরূপ বলে মনে হচ্ছে ??
। এখানে কিছু রুবি:
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";
x ||= y
ভালো কিছু করার জন্য desugars x = x || y
, তাই ??
আসলে প্লেইন আরো অনুরূপ ||
রুবি হবে।
??
শুধুমাত্র খেয়াল সম্পর্কে null
, যেহেতু ||
রুবি মধ্যে অপারেটর, সবচেয়ে ভাষায় যেমন, আরো সম্পর্কে null
, false
, বা কিছু যে একটি মান একটি বুলিয়ান বিবেচনা করা যেতে পারে false
(যেমন কিছু কিছু ভাষায় এ, ""
)। এটি কোনও ভাল বা খারাপ জিনিস নয়, কেবল একটি পার্থক্য।
এই সম্পর্কে বিপজ্জনক কিছুই। আসলে, এটি সুন্দর। পছন্দসই হলে আপনি ডিফল্ট মান যুক্ত করতে পারেন, উদাহরণস্বরূপ:
কোড
int x = x1 ?? x2 ?? x3 ?? x4 ?? 0;
int? x1 = null;
কি সঠিক
x1
- x4
আবশ্যক প্রকারের: এটি কার্যকরভাবে বলতে কোনও অর্থ হয় না, "ফলস্বরূপ 0
যদি x4
এমন মান হয় যা এটি সম্ভবত গ্রহণ করতে পারে না" ( null
)। "নুলযোগ্য টাইপ" এখানে অবশ্যই মূল্যহীন মান প্রকার এবং রেফারেন্স ধরণের উভয়ই অন্তর্ভুক্ত করে । যদি এক বা একাধিক শৃঙ্খলযুক্ত ভেরিয়েবল (শেষটি বাদে) অযোগ্য না হয় তবে এটি একটি সংকলন-সময় ত্রুটি।
"উত্তর নাল কোলেসিং অপারেটর" ( ?? ) যা সঠিকভাবে অসংখ্য উত্তরে চিহ্নিত করা হয়েছে , তার কথা বললে আপনি তার চাচাত ভাইকে "নাল-কন্ডিশনাল অপারেটর" ( ?। বা ? [ ) যা অপারেটর তাও পরীক্ষা করতে চাইতে পারেন এর সাথে অনেক সময় এটি ব্যবহার করা হয় ??
সদস্য অ্যাক্সেস ( ? ) বা সূচক ( ? [ ) ক্রিয়াকলাপ সম্পাদনের আগে নাল পরীক্ষা করার জন্য ব্যবহৃত হয় । এই অপারেটরগুলি আপনাকে নাল চেকগুলি পরিচালনা করতে কম কোড লিখতে সহায়তা করে, বিশেষত ডেটা স্ট্রাকচারে নামার জন্য।
উদাহরণ স্বরূপ:
// 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;
যা আরও ভার্জোজ এবং জটিল।
শুধুমাত্র আপনার বিনোদনের জন্য (জেনে আপনি সবাই সি # লোক ;-)।
আমি মনে করি এটি এর উত্স স্মলটালকের, যেখানে এটি প্রায় বহু বছর ধরে রয়েছে in এটি সেখানে সংজ্ঞায়িত করা হয়েছে:
অবজেক্টে:
? anArgument
^ self
অপরিজ্ঞাপিত অবজেক্টে (ওরফে নীল শ্রেণি):
? anArgument
^ anArgument
এর মূল্যায়ন (?) এবং অ-মূল্যায়ন সংস্করণ (??) উভয়ই রয়েছে।
এটি প্রায়শই অলস-প্রারম্ভিক বেসরকারী (উদাহরণস্বরূপ) ভেরিয়েবলগুলির জন্য গেটর-পদ্ধতিগুলিতে পাওয়া যায়, যা সত্যিই প্রয়োজন না হওয়া অবধি শুন্য থাকে।
কোয়েলেসিং ব্যবহার করে মান পেতে এখানে কয়েকটি উদাহরণ অদক্ষ।
আপনি যা চান তা হ'ল:
return _formsAuthWrapper = _formsAuthWrapper ?? new FormsAuthenticationWrapper();
অথবা
return _formsAuthWrapper ?? (_formsAuthWrapper = new FormsAuthenticationWrapper());
এটি প্রতিবার পুনরায় তৈরি করা থেকে বাধা দেয়। প্রতিটি অনুরোধে প্রাইভেট ভেরিয়েবল অবশিষ্ট নাল এবং একটি নতুন অবজেক্ট তৈরি হওয়ার পরিবর্তে এটি নিশ্চিত করে যে নতুন অবজেক্টটি তৈরি করা হলে প্রাইভেট ভেরিয়েবল নির্ধারিত হয়েছে।
??
ছোট করে কাটা মূল্যায়ন? যদি শূন্য হয় তবেই যদিnew FormsAuthenticationWrapper();
তা মূল্যায়ন করা হয়। _formsAuthWrapper
আমি পুরো এই থ্রেড এবং আরও অনেকগুলি পড়েছি তবে এর মতো সঠিক উত্তর আমি পাই না।
যার মাধ্যমে আমি "কেন ব্যবহার করব ?? এবং কখন ব্যবহার করব ?? এবং কীভাবে ব্যবহার করব ??" পুরোপুরি বুঝতে পেরেছিলাম।
ক্রেগ ম্যাকমুর্ট্রি আইএসবিএন 0-672-32948-4 দ্বারা উইন্ডোজ যোগাযোগ ফাউন্ডেশন প্রকাশ করেছে
দুটি সাধারণ পরিস্থিতি রয়েছে যার মধ্যে কেউ জানতে চান যে কোনও মানের ধরণের উদাহরণকে একটি মূল্য নির্ধারণ করা হয়েছে কিনা। প্রথমটি যখন দৃষ্টান্তটি একটি ডাটাবেজে কোনও মান উপস্থাপন করে। এই জাতীয় ক্ষেত্রে, ডাটাবেসে কোনও মান সত্যই উপস্থিত রয়েছে কিনা তা নির্ধারণের জন্য কেউ উদাহরণটি পরীক্ষা করতে সক্ষম হতে চান। এই পরিস্থিতিটি যখন কোনও দূরবর্তী উত্স থেকে প্রাপ্ত কোনও ডেটা আইটেমটির প্রতিনিধিত্ব করে তখন এই বইয়ের বিষয়টির সাথে সম্পর্কিত circum আবার, কেউ উদাহরণ থেকে নির্ধারণ করতে চান যে that ডেটা আইটেমটির জন্য কোনও মান প্রাপ্ত হয়েছিল কিনা।
.NET ফ্রেমওয়ার্ক ২.০ একটি জেনেরিক টাইপ সংজ্ঞা অন্তর্ভুক্ত করে যা এই জাতীয় ক্ষেত্রে যেমন একটি মান ধরণের উদাহরণকে নাল নির্ধারণ করতে চায় এবং উদাহরণটির মানটি নাল কিনা তা পরীক্ষা করে। সেই জেনেরিক ধরণের সংজ্ঞাটি হ'ল সিস্টেম.নুবলযোগ্য, যা জেনেরিক ধরণের আর্গুমেন্টগুলিকে সীমাবদ্ধ করে যে টি মান ধরণের ক্ষেত্রে প্রতিস্থাপন করতে পারে। System.Nullable থেকে নির্মিত ধরণের উদাহরণগুলি নালীর একটি মূল্য নির্ধারণ করা যেতে পারে; প্রকৃতপক্ষে, তাদের মানগুলি ডিফল্টরূপে বাতিল হয়। সুতরাং, System.Nullable থেকে নির্মিত প্রকারগুলি নালযোগ্য মান ধরণের হিসাবে উল্লেখ করা যেতে পারে। System.Nlalable এর একটি সম্পত্তি, মান থাকে, যার সাহায্যে উদাহরণস্বরূপ মানটি শূন্য না হলে এটি থেকে নির্মিত কোনও প্রকারের উদাহরণের জন্য নির্ধারিত মান পাওয়া যায়। অতএব, একটি লিখতে পারেন:
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;
দ্বিতীয় বিবৃতিটি একটি ব্যতিক্রম ছুঁড়ে ফেলবে কারণ সিস্টেম অ্যাক্সেস করার কোনও প্রচেষ্টা ul অযোগ্য V ভ্যালু সম্পত্তিটি যদি একটি অবৈধ ক্রিয়াকলাপ System যদি সিস্টেম থেকে নির্মিত টাইপটি টির কোনও বৈধ মান নির্ধারণ না করা থাকে, যা এর আগে ঘটেছিল না which কেস।
একটি সাধারণ মূল্য প্রকারের জন্য একটি অযোগ্য মান ধরণের মান নির্ধারণের একটি সঠিক উপায় হ'ল সিস্টেম.নুবলযোগ্য asহাসভ্যালু সম্পত্তি টি-এর একটি কার্যকর মান নলযোগ্য মানের ধরণের ক্ষেত্রে নির্ধারিত হয়েছে কিনা তা নির্ধারণের জন্য:
int? myNullableInteger = null;
if (myNullableInteger.HasValue)
{
int myInteger = myNullableInteger.Value;
}
অন্য বিকল্পটি হ'ল এই বাক্য গঠনটি ব্যবহার করা:
int? myNullableInteger = null;
int myInteger = myNullableInteger ?? -1;
যার মাধ্যমে সাধারণ পূর্ণসংখ্যার myInteger nullable পূর্ণসংখ্যার "myNullableInteger" এর মান নির্ধারিত হয় যদি পরবর্তীটির একটি বৈধ পূর্ণসংখ্যার মান নির্ধারিত হয়; অন্যথায়, myInteger -1 এর মান নির্ধারিত হয়।
এটি একটি নাল কোলেসিং অপারেটর যা কোনও টের্নারি অপারেটরের মতো একইভাবে কাজ করে।
a ?? b => a !=null ? a : b
এর জন্য আরও একটি আকর্ষণীয় বিষয় হ'ল, "একটি অবিচ্ছিন্ন প্রকারের মধ্যে একটি মান থাকতে পারে, বা এটি অপরিবর্তিত হতে পারে" । সুতরাং আপনি যদি একটি নন-অ-মানযোগ্য টাইপকে একটি স্থায়ী মান প্রকারটি নির্ধারণের চেষ্টা করেন তবে আপনি একটি সংকলন-সময় ত্রুটি পাবেন।
int? x = null; // x is nullable value type
int z = 0; // z is non-nullable value type
z = x; // compile error will be there.
তাই ব্যবহার করে কি ?? অপারেটর:
z = x ?? 1; // with ?? operator there are no issues
FormsAuth = formsAuth ?? new FormsAuthenticationWrapper();
সমতুল্য
FormsAuth = formsAuth != null ? formsAuth : new FormsAuthenticationWrapper();
তবে এ সম্পর্কে দুর্দান্ত জিনিসটি হ'ল আপনি তাদের চেইন করতে পারেন, যেমন অন্যান্য লোকেরা বলেছিল। যার পাতলাটি স্পর্শ করা হয়নি তা হ'ল আপনি এটি ব্যতিক্রম ছুঁড়তে ব্যবহার করতে পারেন।
A = A ?? B ?? throw new Exception("A and B are both NULL");
??
অপারেটর নাল-কোয়ালেসিং অপারেটর বলা হয়। অপারেন্ডটি শূন্য না হলে এটি বাম-হাতের অপারেন্ডকে ফিরিয়ে দেয়; অন্যথায় এটি ডান হাত অপারেন্ডকে ফেরত দেয়।
int? variable1 = null;
int variable2 = variable1 ?? 100;
সেট variable2
মূল্য variable1
, যদি variable1
নাল নয়; অন্যথায়, যদি variable1 == null
, variable2
100 এ সেট করুন।
অন্যরা Null Coalescing Operator
বেশ ভাল বর্ণনা করেছেন । আগ্রহীদের জন্য, একটি সংক্ষিপ্ত বাক্য গঠন রয়েছে যেখানে এটি (এসও প্রশ্ন):
FormsAuth = formsAuth ?? new FormsAuthenticationWrapper();
এর সমতুল্য:
FormsAuth ??= new FormsAuthenticationWrapper();
কেউ কেউ এটিকে আরও পঠনযোগ্য এবং সংক্ষিপ্ত বলে মনে করেন।