কন্ডিশন এক্সপ্রেশনে নুলযোগ্য বালের জন্য চেক করার সর্বোত্তম উপায় (যদি…)


207

আমি ভাবছিলাম যে নালাগুলি বালগুলিতে কন্ডিশন চেক করার জন্য সবচেয়ে পরিষ্কার এবং বোধগম্য বাক্য গঠন কী।

নীচেরটি কি ভাল বা খারাপ কোডিং শৈলী? শর্তটি আরও ভাল / আরও পরিষ্কারভাবে প্রকাশ করার উপায় আছে কি?

bool? nullableBool = true;
if (nullableBool ?? false) { ... }
else { ... }

বিশেষত যদি (nullableBool ?? মিথ্যা) অংশ। আমি if (x.HasValue && x.Value)স্টাইল পছন্দ করি না ...

(প্রশ্নটি আগে জিজ্ঞাসা করা হয়েছিল কিনা তা নিশ্চিত নয় ... অনুসন্ধানের সাথে অনুরূপ কিছু খুঁজে পাওয়া যায়নি)

উত্তর:


361

আমি মনে করি যে অনেক লোক এই মানটি অবনমিত হয় এই বিষয়ে মনোনিবেশ করে এবং তারা আসলে কী চায় তা নিয়ে চিন্তা করবেন না :)

bool? nullableBool = true;
if (nullableBool == true) { ... } // true
else { ... } // false or null

অথবা আপনি যদি আরও বিকল্প চান ...

bool? nullableBool = true;
if (nullableBool == true) { ... } // true
else if (nullableBool == false) { ... } // false
else { ... } // null

(nullableBool == true)বুল আসলে কি আর ফিরে আসবে না? is null: পি


2
আমি বুঝতে পারিনি যে নালামে তুলনাটি এর অর্থবহ ছিল। বিস্তারিত পাওয়া যাবে msdn.microsoft.com/en-us/library/2cf62fcy.aspx
মীখা Zoltu

79

কিভাবে ব্যবহার সম্পর্কে GetValueOrDefault , যা প্রশংসনীয় স্ব-ব্যাখ্যা এবং ডিফল্ট যাহা চান ব্যবহার করতে অনুমতি দেয়:

if (nullableBool.GetValueOrDefault(false)) {
}

6
প্রসঙ্গের উপর নির্ভর করে এই পদ্ধতিটি ফেলে দিতে পারেSystem.NotSupportedException: LINQ to Entities does not recognize the method 'Boolean GetValueOrDefault()' method, and this method cannot be translated into a store expression.
Nano Taboada

3
আমি এই পদ্ধতির পছন্দ করি কারণ এটি একটি নন-ইফ স্টেটমেন্টে (যেমন অ্যাসাইনমেন্ট) কাজ করে।
paultechguy

48

আপনি এটি পছন্দ নাও করতে পারেন, তবে ব্যক্তিগতভাবে আমি এটি খুঁজে পাই

if (x.HasValue && x.Value)

সর্বাধিক পাঠযোগ্য এটি স্পষ্ট করে তোলে যে আপনি একটি অযোগ্য প্রকারের সাথে কাজ করছেন এবং এটি এটি পরিষ্কার করে দেয় যে শর্তসাপেক্ষে অভিনয় করার আগে আপনি প্রথমে নালার কোনও মূল্য আছে কিনা তা যাচাই করে দেখছেন।

আপনি যদি নিজের সংস্করণটি গ্রহণ করেন এবং x এর সাথে ভেরিয়েবলটি প্রতিস্থাপন করেন তবে এটিও পড়ে:

if (x ?? false)

এটা কি পরিষ্কার? এটি কি স্পষ্টত x একটি ক্ষুদ্র প্রকার? আমি আপনাকে সিদ্ধান্ত নিতে দেব।


আমি যতদূর জানি, ?? শুধুমাত্র nlalable ধরণের উপর কাজ করে। প্লাস ভেরিয়েবলের x এর চেয়েও সুন্দর নাম থাকা উচিত
ফায়ারস্পেক

5
"Nullable type" দ্বারা আমি বিশেষত System.Nullable প্রকারগুলি বোঝাতে চাইছি। যে কোনও রেফারেন্স টাইপ নালার হতে পারে। এছাড়াও, যদি আপনাকে এর নামের অংশ হিসাবে কোনও ভেরিয়েবলের প্রকারটি ব্যবহার করতে হয় তবে তা আপনার কোডটি পরিষ্কার নয় indic
ড্যান ডিপ্লো

@ ড্যানডিপ্লো কীভাবে এর জন্য ইউটি লিখবেন?
প্রশান্ত যাদব

xপ্রসঙ্গে ভাল এবং কখনও কখনও পরিষ্কার হয়; টু বুদ্ধি:var openOrders = orders.Where(x=>x.Open ?? false)
অযৌক্তিকভাবে

21

যদি আপনি কোনও nullমিথ্যা হিসাবে বিবেচনা করতে চান , তবে আমি বলব যে এটি করার সর্বাধিক সংক্ষিপ্ত উপায় হ'ল নাল কোলেসেস অপারেটর ( ??) ব্যবহার করা, যেমন আপনি বর্ণনা করেছেন:

if (nullableBool ?? false) { ... }

8

শুধু বুলের কথা ভাবি? 3 টি মান থাকার পরে জিনিসগুলি সহজ হয়:

if (someNullableBool == true)     // only if true
if (someNullableBool == false)    // only if false
if (someNullableBool == null)     // only if null

8

এক্সটেনশন ব্যবহার করুন।

public static class NullableMixin {
    public static bool IsTrue(this System.Nullable<bool> val) {
        return val == true;
    }
    public static bool IsFalse(this System.Nullable<bool> val) {
        return val == false;
    }
    public static bool IsNull(this System.Nullable<bool> val) {
        return val == null;
    }
    public static bool IsNotNull(this System.Nullable<bool> val) {
        return val.HasValue;
    }
}


Nullable<bool> value = null;
if(value.IsTrue()) {
// do something with it
}

আপনি যদি nullহিসাবে বিবেচনা করতে চান true?
থিবল্ট মিথ্যা

ইসট্রু () | ইসনুল () .. :) এসকিউএল নালীর সাথে কীভাবে কাজ করে তা আমি যুক্তি পুনরুত্পাদন করেছি। আমি মনে করি এটি সবচেয়ে পরিষ্কার এবং বোধগম্য সিনট্যাক্স।
আন্দ্রে ফ্রোলভ

এটি পাবলিক স্ট্যাটিক বুল ইসফালস হওয়া উচিত (এই সিস্টেমটি.নুল্যযোগ্য ভাল) {রিটার্ন! ভাল ?? সত্য;
ull নালকে

2
এটি শেষ দুটি পদ্ধতিতে (যেমন ইসনুল, এবং ইসনটনল) সেমিকোলনগুলি নিখোঁজ হতে পারে
গ্লেন গারসন

4

নলের সাথে তুলনা কীভাবে সংজ্ঞায়িত করা হয়েছে তা পরীক্ষা করে দেখুন:

static void Main()
    {
        Console.WriteLine($"null != null  => {null != null}");
        Console.WriteLine($"null == null  => {null == null}");
        Console.WriteLine($"null != true  => {null != true}");
        Console.WriteLine($"null == true  => {null == true}");
        Console.WriteLine($"null != false => {null != false}");
        Console.WriteLine($"null == false => {null == false}");
    }

এবং ফলাফলগুলি হ'ল:

null != null  => False                                                                                                                                                                                                                                  
null == null  => True                                                                                                                                                                                                                                   
null != true  => True                                                                                                                                                                                                                                   
null == true  => False                                                                                                                                                                                                                                  
null != false => True                                                                                                                                                                                                                                   
null == false => False

সুতরাং আপনি নিরাপদে ব্যবহার করতে পারেন:

// check if null or false
if (nullable != true) ...

// check if null or true
if (nullable != false) ...

// check if true or false
if (nullable != null) ...

আমি কেবল ভাবছি যে আমরা কেন (অযোগ্য) তা করতে পারছি না .... এটি হ্যান্ডেল হবে তবে সাবধানতার সাথে চিকিত্সা করা দরকারif(nullable)...else if(!nulllable)...else..
IronHide

আমি গত বছরগুলিতে বলব কোডিং শৈলী (স্টাইলোকপ, বিশ্লেষক ইত্যাদির মতো সরঞ্জামের প্রাপ্যতার কারণে) আরও বেশি, দ্ব্যর্থহীন, স্পষ্ট, "উদ্দেশ্য নিশ্চিতকরণ" কোডটিকে প্রাধান্য দিচ্ছে (উদাহরণস্বরূপ উদ্দেশ্যহীন ব্যবহারের নিশ্চয়তা দেওয়ার জন্য বিনা বিবিধ বন্ধনী ব্যবহার করার পরামর্শ দেওয়া হচ্ছে) অপারেটরদের অগ্রাধিকার, বা বিভিন্ন টিকা / চুক্তি সিস্টেম ব্যবহার করে)। আইএমও যেমন একটি সিনট্যাক্স প্রবর্তন করে তবে কীভাবে বেনিফিটের তুলনায় নালাগুলি পরিচালনা করা হয় তা স্পষ্টতার স্তরের কারণে আরও বেশি বিভ্রান্তি সৃষ্টি হয়।
জেড Moncz

4

আসলে আমি এটা মনে করি (nullableBool ?? false) এটি একটি বৈধ বিকল্প, বিশেষত যখন আপনি লিনক-এ একটি nullable bool মূল্যায়ন করার চেষ্টা করছেন।

উদাহরণ স্বরূপ:
array.Select(v => v.nullableBool ?? false)
(from v in array where v.nullableBool ?? false)

এর বিপরীতে আমার মতে পরিষ্কার কি :
array.Select(v => v.nullableBool.HasValue ? v.nullableBool.Value : false)
(from v in array where v.nullableBool.HasValue ? v.nullableBool.Value : false)


1

আপনি যদি কেবল / এর trueবিরুদ্ধে পরীক্ষা করতে চান তবে , আমি সবেমাত্র ব্যবহার করেছি এবং পড়েছি তা হ'লnullfalse

bool? someCondition = null
if (someCondition.Equals(true))
...

1
আপনি কি এখানে নাল রেফারেন্স ব্যতিক্রম পাচ্ছেন না?
চেজ ফ্লোরেল

@ চেজফ্লোরিল আমাকে ভিএস ইন্টারেক্টিভ উইন্ডোতে এটি ডাবল চেক করতে হয়েছিল .. সুতরাং মনে রাখার মতো বিষয়টি হ'ল সামোকানডির ধরণটি হ'ল নুলাব্য <bool> object , তবে মান নয়
ds494040

আকর্ষণীয়, আমি এখন এটি দেখতে পারেন। এখনও রেফারেন্স ধরনের জন্য কুয়াশাচ্ছন্ন dotnetfiddle.net/8cAI21
চেজ Florell

0

আমি মনে করি এটি আপনার উপর নির্ভর করে। আমি অবশ্যই মনে করি .হসালভ পদ্ধতিটি আরও পাঠযোগ্য, বিশেষত বিকাশকারীদের সাথে ?? বাক্য গঠন.

একটি বর্ধনযোগ্য বুলিয়ান ধরণের অন্য বিষয়টি এটি ত্রিস্টেট, সুতরাং আপনি যখন অন্যটি করতে চান তবে এটি কেবল নাল হয়, এবং মিথ্যাতে ডিফল্ট হয় না।


0

এনাম দেওয়া হয়েছে

public enum PublishMode { Edit, View }

আপনি এখানে এটি করতে পারেন

 void MyMethod(PublishMode? mode)
    {
       var publishMode = mode ?? PublishMode.Edit;

//or
       if (mode?? PublishMode.Edit == someValue)
       ....
    }

প্রশ্নের উত্তর নয়, যা সম্পর্কে বিশেষভাবে nullable boolean
টুলমেকারস্টেভ

0

যদি আপনি এমন পরিস্থিতির মধ্যে থাকেন যে শর্তের কোনও অংশ কোনও অযোগ্য মান পরীক্ষা করছে কিনা তা নিয়ন্ত্রণ করতে না পারলে আপনি সর্বদা নিম্নলিখিত চেষ্টা করতে পারেন:

if( someInt == 6 && someNullableBool == null ? false : (bool)someNullableBool){
    //perform your actions if true
}

আমি জানি এটি হ'ল কোনও বিশোধবাদী পদ্ধতির নয় যদি একটি ইফ স্টেটমেন্টে একটি টের্নারি লাগানো হয় তবে এটি সমস্যাটি পরিষ্কারভাবে সমাধান করে।

এটি অবশ্যই বলার একটি ম্যানুয়াল পদ্ধতি GetValueOrDefault(false)


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