সি # তে দুটি প্রশ্ন চিহ্ন এক সাথে কী বোঝায়?


1628

কোডের এই লাইনটি পেরিয়ে গেল:

FormsAuth = formsAuth ?? new FormsAuthenticationWrapper();

দুটি প্রশ্ন চিহ্নের অর্থ কী, এটি কোনও ধরণের টেরিনারি অপারেটর? গুগলে সন্ধান করা শক্ত।


50
এটা স্পষ্টভাবে এর না একটি তিন অপারেটর - এটি শুধুমাত্র দুই operands আছে! এটা তোলে শর্তসাপেক্ষ অপারেটর (যা মত একটি বিট এর হয় তিন) কিন্তু নাল কোয়ালেসিং অপারেটর একটি বাইনারি অপারেটর।
জন স্কিটি

90
আমি এটি একটি সাক্ষাত্কারে ব্যাখ্যা করেছি যেখানে সম্ভাব্য নিয়োগকর্তা আমার সি # ক্ষমতা সম্পর্কে পূর্বে সন্দেহ প্রকাশ করেছিলেন, কারণ আমি জাভাটি আগে কিছুদিন পেশাদারভাবে ব্যবহার করছিলাম। তারা এর আগে শুনেনি, এবং তার পরে সি # এর সাথে আমার পরিচিতি নিয়ে প্রশ্ন দেয়নি :)
জন স্কিটি

77
@ জোন স্কিটি যে ছেলেটি বিটলসকে প্রত্যাখ্যান করেছিল, সেহেতু দক্ষতার স্বীকৃতি দিতে এই জাতীয় মহাকাব্য ব্যর্থ হয়নি। :-) এখন থেকে কেবল তাদের ভিতরের প্রচ্ছদে লিখিত আপনার এসও প্রোফাইলে url লিঙ্ক সহ আপনার বইয়ের একটি অনুলিপি প্রেরণ করুন।
আইয়েন ধারক

6
IainMH কি এটা মূল্য জন্য, আমি নি বেশ এখনো বই লিখতে শুরু করেন। (অথবা সম্ভবত আমি কেবল অধ্যায় 1 - এ জাতীয় কিছুতে কাজ করছিলাম Ad) স্বীকার করা হয়েছে যে আমার জন্য অনুসন্ধান করলে খুব দ্রুত আমার ব্লগ + নিবন্ধগুলি পাওয়া যায়
জোন স্কিেট

7
পুনরায়: কিউতে শেষ বাক্য - ভবিষ্যতের রেফের জন্য, সিম্বলহাউন্ড এই জাতীয় জিনিসের জন্য দুর্দান্ত উদাহরণস্বরূপ সিম্বহাউন্ড. com/?q=%3F%3F&l=&e=&n=&u = [সন্দেহজনক কারও কাছে - আমি এতে যুক্ত নই যে কোনও উপায়ে, আমি যখন একটি ভাল সরঞ্জাম পাই তখন ঠিক তার মতো ...]
স্টিভ চেম্বারস

উত্তর:


2152

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

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;

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


17
এগুলি শৃঙ্খলাবদ্ধ হওয়ার পক্ষে সম্ভবত বিপদজনক
কুপস

6
@ কোডবেলেন্ড কীভাবে?
এলসি

68
@ কোডবেলেন্ড, এটি বিপজ্জনক নয়। আপনি যদি প্রসারিত করতে থাকেন তবে আপনার / অন্যদের বিবৃতিতে কেবল নেস্ট করা একটি সিরিজ থাকবে। বাক্য গঠনটি কেবল অদ্ভুত কারণ আপনি এটি দেখতে অভ্যস্ত নন।
জোয়েলমদেব

31
এটি যদি খালি স্ট্রিংয়ের জন্যও কাজ করে তবে এটি কোনও god
শ্বরের পাঠানো হত

14
@ গুড্ডর সাহচর্য ??বাকী, তাই a ?? b ?? c ?? dসমান ((a ?? b) ?? c ) ?? d। "অ্যাসাইনমেন্ট অপারেটর এবং টেরিনারি অপারেটর (? :) ডান অ্যাসোসিয়েটিভ other অন্য সমস্ত বাইনারি অপারেটর বাম মিশ্রণমূলক।" সূত্র: এমএসডিএন.মাইক্রোসফটকম /en-us/library/ms173145.aspx
মার্ক ই। হাজেস

284

অন্য কেউ এখনও ম্যাজিক শব্দটি বলেন নি কারণ: এটি নাল কোলেসিং অপারেটর । এটি সি # 3.0 ভাষার স্পেসিফিকেশনের 7.12 বিভাগে সংজ্ঞায়িত করা হয়েছে ।

এটি খুব সহজ, বিশেষত এটি যখন কোনও অভিব্যক্তিতে একাধিকবার ব্যবহৃত হয় তখন এটি কাজ করে works ফর্ম একটি অভিব্যক্তি:

a ?? b ?? c ?? d

অভিব্যক্তির ফলাফল aযদি এটি শূন্য হয় না, অন্যথায় চেষ্টা করুন b, অন্যথায় চেষ্টা করুন c, অন্যথায় চেষ্টা করুন d। এটি প্রতিটি পয়েন্টে শর্ট সার্কিট।

এছাড়াও, প্রকারটি dযদি অ-অযোগ্য হয় তবে সম্পূর্ণ এক্সপ্রেশনটির ধরণটিও অ-শুরুর।


2
আমি পছন্দ করি আপনি কীভাবে এর অর্থ "নাল কোয়েলসিং অপারেটর" এর কাছে সহজ করেছেন। আমার যা দরকার তা হ'ল।
ফ্রাঙ্কো

2
স্পর্শিনী কিন্তু সম্পর্কিত: এটা সুইফট এখন, কিন্তু খুব ভিন্ন: "নীল কোয়ালেসিং অপারেটর" developer.apple.com/library/ios/documentation/Swift/Conceptual/...
ড্যান Rosenstark

69

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

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

হ্যাঁ, এটি কী বলা হয় তা না জানলে অনুসন্ধান করা প্রায় অসম্ভব! :-)

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

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


33
কমপক্ষে এখন, এটি সন্ধান করা সহজ, আপনি নামটি না
জানলেও

27

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

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

4
এই একটি গুরুত্বপূর্ণ দিক ইঙ্গিত ?? অপারেটর - এটি নলযোগ্য প্রকারের সাথে কাজ করতে সহায়তা করার জন্য প্রবর্তিত হয়েছিল। আপনার উদাহরণে, "এক্স" টাইপ "ইনট"? (Nullable <int- এ>)।
ড্রয় নোকস

9
@ ভিটাইল নং, যদি নাল কোলেসেসিং অপারেটরের দ্বিতীয় অপারেন্ডটি অযোগ্য হয়, তবে ফলাফলটি অযোগ্য হয় (এবং -1এটি কেবল একটি সমতল int, যা অযোগ্য) n
সুজান ডুপোরন

আমি সত্যিই আশা করি এটি এর মতো কাজ করে। আমি এটি সর্বদা করতে চাই, তবে আমি করতে পারি না কারণ আমি যে পরিবর্তনশীলটি ব্যবহার করছি তা কোনও প্রকারভেদ নয়। কফিস্ক্রিপ্ট y = x এ কাজ করে? -1
পান্ডাওড

@ পান্ডাওয়ুড আসলে, আপনি পারেন। যদি xটাইপ হয় int?তবে yটাইপ হয় int, আপনি লিখতে পারতেন int y = (int)(x ?? -1)। এটা তোলে পার্স হবে xএকটি করতে intযদি না হয় তাহলে null, বা দায়িত্ব অর্পণ -1করা yযদি xহয় null
জোহান উইন্টজেনস

21

??মানটি শূন্য হয় তখন একটি নলাবদ্ধ টাইপের জন্য একটি মান সরবরাহ করতে পারে। সুতরাং, যদি ফর্মস আথটি শূন্য হয়, তবে এটি নতুন ফর্মসৌষ্ঠিকতাওয়ালা () ফিরে আসবে।


19

এখানে চিত্র বর্ণনা লিখুন

দুটি প্রশ্ন চিহ্ন (??) ইঙ্গিত করে যে এটি একটি কোলেসিং অপারেটর।

Coalescing অপারেটর একটি চেইন থেকে প্রথম NON-NULL মান প্রদান করে। আপনি এই ইউটিউব ভিডিওটি দেখতে পারবেন যা পুরো জিনিসটি ব্যবহারিকভাবে প্রদর্শন করে।

তবে ভিডিওটি যা বলেছে তাতে আমাকে আরও যুক্ত করতে দিন।

যদি আপনি coalescing এর ইংরেজী অর্থ দেখতে পান তবে এটি "একত্রে একত্রিত করা" বলে। উদাহরণস্বরূপ নীচে একটি সাধারণ কোলেসিং কোড যা চারটি স্ট্রিং চেইন করে।

সুতরাং যদি এটি str1হয় তবে nullএটি চেষ্টা করবে str2, যদি str2হয় তবে nullএটি চেষ্টা করবে str3এবং যতক্ষণ না এটি একটি নন-নাল মান সহ একটি স্ট্রিং খুঁজে না পায়।

string final = str1 ?? str2 ?? str3 ?? str4;

সহজ কথায় কোলেসিং অপারেটর একটি চেইন থেকে প্রথম NON-NULL মান প্রদান করে।


আমি এই ব্যাখ্যাটি পছন্দ করি কারণ এটিতে একটি চিত্র রয়েছে এবং তারপরে শেষ বাক্যটি এটিকে এত সহজ শর্তে ব্যাখ্যা করে! এটি বোঝা সহজ করে তোলে এবং ব্যবহারের ক্ষেত্রে আমার আত্মবিশ্বাসকে বাড়িয়ে তোলে। ধন্যবাদ!
জোশুয়া কে

14

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

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

বা যারা তিনটি কাজ করেন না তাদের জন্য:

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

3
আমি কেবল "টার্নারি" এর বানান সংশোধন করেছি তবে সত্যিকার অর্থে যে অপারেটরটি আপনি বলতে চাচ্ছেন তা হচ্ছে শর্তসাপেক্ষ অপারেটর। এটি সি # এর একমাত্র ত্রিনিয়ী অপারেটর হিসাবে দেখা যায় তবে কোনও সময়ে তারা আরও একটি যুক্ত করতে পারে, "বিন্যাস" দ্বিপাক্ষিক হবে তবে "শর্তসাপেক্ষ" হবে না।
জন স্কিটি

এটা আপনি করতে সাঁটে লেখার কি তিন (শর্তসাপেক্ষ) অপারেটর সঙ্গে। আপনার দীর্ঘ আকারে, পরীক্ষা ( != null) এবং দ্বিতীয় formsAuth(পরে ) উভয়ই ?পরিবর্তন করা যেতে পারে; নাল একত্রিত আকারে, উভয়ই স্পষ্টভাবে আপনার সরবরাহিত মানগুলি গ্রহণ করে।
বব সমার্স

12

আপনি যদি রুবির সাথে পরিচিত হন তবে এটি আমার ||=কাছে সি # এর অনুরূপ বলে মনে হচ্ছে ??। এখানে কিছু রুবি:

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";

4
x ||= yভালো কিছু করার জন্য desugars x = x || y, তাই ??আসলে প্লেইন আরো অনুরূপ ||রুবি হবে।
কেরুব

6
লক্ষ্য করুন ??শুধুমাত্র খেয়াল সম্পর্কে null, যেহেতু ||রুবি মধ্যে অপারেটর, সবচেয়ে ভাষায় যেমন, আরো সম্পর্কে null, false, বা কিছু যে একটি মান একটি বুলিয়ান বিবেচনা করা যেতে পারে false(যেমন কিছু কিছু ভাষায় এ, "")। এটি কোনও ভাল বা খারাপ জিনিস নয়, কেবল একটি পার্থক্য।
টিম এস

11

coalescing অপারেটর

এটি সমান

FormsAuth = formsAUth == null ? new FormsAuthenticationWrapper() : formsAuth

11

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

কোড

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

1
সুতরাং x1, x2, x3, এবং x4 হ্রাসযোগ্য প্রকারের হতে পারে, উদাহরণস্বরূপ: এটি int? x1 = null;কি সঠিক
কেভিন মেরিডিথ

1
@ কেভিনমারেডিথ x1- x4আবশ্যক প্রকারের: এটি কার্যকরভাবে বলতে কোনও অর্থ হয় না, "ফলস্বরূপ 0যদি x4এমন মান হয় যা এটি সম্ভবত গ্রহণ করতে পারে না" ( null)। "নুলযোগ্য টাইপ" এখানে অবশ্যই মূল্যহীন মান প্রকার এবং রেফারেন্স ধরণের উভয়ই অন্তর্ভুক্ত করে । যদি এক বা একাধিক শৃঙ্খলযুক্ত ভেরিয়েবল (শেষটি বাদে) অযোগ্য না হয় তবে এটি একটি সংকলন-সময় ত্রুটি।
বব সমার্স 20'16

11

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

নাল-কন্ডিশনাল অপারেটর

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

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

// 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; 

যা আরও ভার্জোজ এবং জটিল।


10

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

আমি মনে করি এটি এর উত্স স্মলটালকের, যেখানে এটি প্রায় বহু বছর ধরে রয়েছে in এটি সেখানে সংজ্ঞায়িত করা হয়েছে:

অবজেক্টে:

? anArgument
    ^ self

অপরিজ্ঞাপিত অবজেক্টে (ওরফে নীল শ্রেণি):

? anArgument
    ^ anArgument

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


ইউজারকন্ট্রোলটিতে কোনও সম্পত্তি দিয়ে ভিউস্টেট মোড়ানোর মতো শোনাচ্ছে। এটি যদি আগে সেট না করা থাকে তবে কেবল প্রথম পেতে শুরু করুন। =)
Seiti

9

কোয়েলেসিং ব্যবহার করে মান পেতে এখানে কয়েকটি উদাহরণ অদক্ষ।

আপনি যা চান তা হ'ল:

return _formsAuthWrapper = _formsAuthWrapper ?? new FormsAuthenticationWrapper();

অথবা

return _formsAuthWrapper ?? (_formsAuthWrapper = new FormsAuthenticationWrapper());

এটি প্রতিবার পুনরায় তৈরি করা থেকে বাধা দেয়। প্রতিটি অনুরোধে প্রাইভেট ভেরিয়েবল অবশিষ্ট নাল এবং একটি নতুন অবজেক্ট তৈরি হওয়ার পরিবর্তে এটি নিশ্চিত করে যে নতুন অবজেক্টটি তৈরি করা হলে প্রাইভেট ভেরিয়েবল নির্ধারিত হয়েছে।


নয় ??ছোট করে কাটা মূল্যায়ন? যদি শূন্য হয় তবেই যদিnew FormsAuthenticationWrapper(); তা মূল্যায়ন করা হয়। _formsAuthWrapper
এমএসএলটার

হ্যাঁ পুরো বিষয়টি। ভেরিয়েবলটি শূন্য হলে আপনি কেবল পদ্ধতিটি কল করতে চান। @ এসএমএলটার্স
কিংঅফ হাইপোক্রিটস

8

বিঃদ্রঃ:

আমি পুরো এই থ্রেড এবং আরও অনেকগুলি পড়েছি তবে এর মতো সঠিক উত্তর আমি পাই না।

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

সূত্র:

ক্রেগ ম্যাকমুর্ট্রি আইএসবিএন 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 এর মান নির্ধারিত হয়।


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

1
FormsAuth = formsAuth ?? new FormsAuthenticationWrapper();

সমতুল্য

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

তবে এ সম্পর্কে দুর্দান্ত জিনিসটি হ'ল আপনি তাদের চেইন করতে পারেন, যেমন অন্যান্য লোকেরা বলেছিল। যার পাতলাটি স্পর্শ করা হয়নি তা হ'ল আপনি এটি ব্যতিক্রম ছুঁড়তে ব্যবহার করতে পারেন।

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

এটি সত্যিই দুর্দান্ত যে আপনি নিজের পোস্টে উদাহরণগুলি অন্তর্ভুক্ত করেছেন, যদিও প্রশ্নটি অপারেটরটি কী বা কী তার ব্যাখ্যা খুঁজছিল।
TGP1994

1

??অপারেটর নাল-কোয়ালেসিং অপারেটর বলা হয়। অপারেন্ডটি শূন্য না হলে এটি বাম-হাতের অপারেন্ডকে ফিরিয়ে দেয়; অন্যথায় এটি ডান হাত অপারেন্ডকে ফেরত দেয়।

int? variable1 = null;
int variable2  = variable1 ?? 100;

সেট variable2মূল্য variable1, যদি variable1নাল নয়; অন্যথায়, যদি variable1 == null, variable2100 এ সেট করুন।


0

অন্যরা Null Coalescing Operatorবেশ ভাল বর্ণনা করেছেন । আগ্রহীদের জন্য, একটি সংক্ষিপ্ত বাক্য গঠন রয়েছে যেখানে এটি (এসও প্রশ্ন):

FormsAuth = formsAuth ?? new FormsAuthenticationWrapper();

এর সমতুল্য:

FormsAuth ??= new FormsAuthenticationWrapper();

কেউ কেউ এটিকে আরও পঠনযোগ্য এবং সংক্ষিপ্ত বলে মনে করেন।

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