শনাক্তযোগ্য প্রকারগুলি: সি # এ নাল বা শূন্যের জন্য পরীক্ষা করার আরও ভাল উপায়


85

আমি এমন একটি প্রকল্পে কাজ করছি যেখানে আমি দেখতে পেয়েছি যে অনেকগুলি, অনেক জায়গাতেই আমি নীচেরগুলির জন্য চেক করছি:

if(item.Rate == 0 || item.Rate == null) { }

যে কোনও কিছুর চেয়ে কৌতূহল হিসাবে, উভয় ক্ষেত্রেই পরীক্ষা করার সর্বোত্তম উপায় কোনটি?

আমি একটি সহায়ক পদ্ধতি যুক্ত করেছি যা হ'ল:

public static bool nz(object obj)
{
    var parsedInt = 0;
    var parsed = int.TryParse(obj.ToString(), out parsedInt);
    return IsNull(obj) || (parsed && parsedInt == 0);
}

একটি ভাল উপায় আছে কি?

উত্তর:


162

আমি পছন্দ করি if ((item.Rate ?? 0) == 0) { }

আপডেট 1:

আপনি যেমন কোনও এক্সটেনশন পদ্ধতিটিও সংজ্ঞায়িত করতে পারেন:

public static bool IsNullOrValue(this double? value, double valueToCheck)
{
    return (value??valueToCheck) == valueToCheck;
}

এবং এটি এর মতো ব্যবহার করুন:

if(item.IsNullOrValue(0)){} // তবে আপনি এ থেকে তেমন কিছু পান না


4
আপনাকে ধন্যবাদ - খুব সাফল্য! আমি পাঠ্যতার সাথে উদ্বিগ্ন ছিলাম, কিন্তু এই সিদ্ধান্তে পৌঁছেছি যে আমি যদি আসলে বুঝতে পারি তবে এটি পুরোপুরি পাঠযোগ্য হবে ?? অপারেটর.
নাইলিটডাউন

4
আপনার এক্সটেনশন পদ্ধতিটি ব্যবহার করা উচিত; এটি যখন লেখার মুহুর্তে পঠনযোগ্য হয়, এই ছোট্ট কোডটি ন্যাগটসের জন্য চিন্তার একটি ভগ্নাংশ প্রয়োজন, অর্থাত্ যদি আপনি কোড পড়ার চেষ্টা করেন এবং এটি ব্যবহার করে - আপনি আপনার মূল সমস্যা থেকে বিক্ষিপ্ত হন।
Configurator

11
@ নাইলিটডাউন: সত্যই নয়, নুলাবাল <T> এর জন্য আপনার কেবল একটি এক্সটেনশন পদ্ধতি প্রয়োজন। ডাবল? নুলাবল <ডাবল> এর একটি নাম for আপনার স্বাক্ষরটি দেখতে পাবেন: পাবলিক স্ট্যাটিক বুল ইসনুল ওভ্যালু <টি> (এই নালাগুলি <T>, টি মান টিচেক) যেখানে টি: স্ট্রাক্ট
জোশুয়া শ্যানন

4
@ নেলিটডাউন: (দ্বিতীয় খণ্ড) আপনার রিটার্নের স্টেটমেন্টটি রিটার্নের মতো দেখাচ্ছে (মান ?? ডিফল্ট (টি)) Equ সমান (ভ্যালুটোচেক);
জোশুয়া শ্যানন

4
আপনি যদি এটি "ইসনুলআর (0)" এ সংক্ষিপ্ত করে রেখেছিলেন তবে এটি স্বাভাবিকভাবে "নাল বা শূন্য" হিসাবে পড়তে পারে
ক্রিসফক্স

41

জেনেরিক ব্যবহার:

static bool IsNullOrDefault<T>(T value)
{
    return object.Equals(value, default(T));
}

//...
double d = 0;
IsNullOrDefault(d); // true
MyClass c = null;
IsNullOrDefault(c); // true

যদি Tএটি একটি এর রেফারেন্স টাইপ , valueসঙ্গে তুলনা করা হবে null( default(T)), অন্যথায়, যদি Tএকটি হয় value type, এর ডবল বলা যাক default(t), 0 দিন জন্য bool, হয় false, জন্য গৃহস্থালি '\0'ইত্যাদি ...


4
সম্প্রসারণ পদ্ধতি:public static bool IsNullOrValue<T>(this T? value, T valueToCheck) where T : struct { return (value ?? default(T)).Equals(valueToCheck); }
বেহজাদ ইব্রাহিমি

39

যদিও আমি গ্রহণযোগ্য উত্তরটি বেশ পছন্দ করি, তবে আমি মনে করি যে সম্পূর্ণতার জন্য এই বিকল্পটিও উল্লেখ করা উচিত:

if (item.Rate.GetValueOrDefault() == 0) { }

এই সমাধান


¹ এটি আপনার সিদ্ধান্তকে প্রভাবিত করবে না, যদিও এই ধরণের মাইক্রো-অপ্টিমাইজেশনের কোনও পার্থক্য হওয়ার সম্ভাবনা কম।


19

এটি কেবল জেনারিক্স ব্যবহার করে ফ্রেডি রিওসের গৃহীত উত্তরগুলির কেবলমাত্র একটি বিস্তার expansion

public static bool IsNullOrDefault<T>(this Nullable<T> value) where T : struct
{
    return default(T).Equals( value.GetValueOrDefault() );
}

public static bool IsValue<T>(this Nullable<T> value, T valueToCheck) where T : struct
{
    return valueToCheck.Equals((value ?? valueToCheck));
}

দ্রষ্টব্য, নালীর জন্য আমাদের ডিফল্ট (টি) পরীক্ষা করার দরকার নেই যেহেতু আমরা উভয়ই মান ধরণের বা স্ট্রাক্ট নিয়ে কাজ করছি! এর অর্থ হ'ল আমরা নিরাপদে টি মান ধরে নিতে পারিToCheck বাতিল হবে না; মনে আছে এখানে? শর্টহ্যান্ড হ'ল নলেবল <টি> তাই নুলাবল <T> এ এক্সটেনশন যুক্ত করে আমরা পদ্ধতিটি পাই? ডাবল ?, বুল? ইত্যাদি

উদাহরণ:

double? x = null;
x.IsNullOrDefault(); //true

int? y = 3;
y.IsNullOrDefault(); //false

bool? z = false;
z.IsNullOrDefault(); //true

2

আমি ব্যবহারের সাথে একমত ?? অপারেটর.

যদি আপনি স্ট্রিংগুলি ব্যবহার করে থাকেন তবে (স্ট্রিং.আইএসনুলআরএম্পটি (মাইএসটিআর)) ব্যবহার করুন


2

একটি ভাল উপায় আছে কি?

ঠিক আছে, আপনি যদি সত্যিই আরও ভাল উপায়ের সন্ধান করে থাকেন তবে আপনি সম্ভবত রেটের শীর্ষে বিমূর্ততার আরও একটি স্তর যুক্ত করতে পারেন। ভাল এখানে এমন কিছু যা আমি স্রেফ নলেবল ডিজাইন প্যাটার্নটি ব্যবহার করে নিয়ে এসেছি।

সিস্টেম ব্যবহার করে;
সিস্টেম.কলেশন.জেনারিক ব্যবহার করে;

নেমস্পেস নুলবজেক্টপ্যাটার্ন টেস্ট
{
    পাবলিক ক্লাস প্রোগ্রাম
    {
        পাবলিক স্ট্যাটিক অকার্যকর মেইন (স্ট্রিং [] আরগস)
        {
            var আইটেম = নতুন তালিকা
                            {
                                নতুন আইটেম (রেটফ্যাক্টরি। তৈরি করুন (20%),
                                নতুন আইটেম (রেটফ্যাক্টরি। তৈরি করুন (নাল))
                            };

            প্রিন্টপ্রাইসফোরআইটেমস (আইটেম);
        }

        ব্যক্তিগত স্ট্যাটিক অকার্যকর
        {
            ভবিষ্যদ্বাণী (আইটেমগুলিতে বিভিন্ন আইটেম)
                কনসোল.ওরাইটলাইন ("আইটেমের মূল্য: {0: সি}", আইটেম etGetPrice ());
        }
    }

    পাবলিক বিমূর্ত শ্রেণি আইটেমবেস
    {
        সর্বজনীন বিমূর্ত হারের হার {পেতে; }
        পাবলিক ইন গেটপ্রিস ()
        {
            // রেট == 0 বা হার == নাল কিনা তা খতিয়ে দেখার দরকার নেই
            প্রত্যাবর্তন 1 * হার। মূল্য;
        }
    }

    পাবলিক ক্লাস আইটেম: আইটেমবেস
    {
        প্রাইভেট রিডনলি রেট _ রেট;
        সর্বজনীন ওভাররাইডের হারের হার {get {ret _Rate; }}
        সর্বজনীন আইটেম (হারের হার) R _ হার = হার; }
    }

    পাবলিক সিল ক্লাস রেটফ্যাক্টরি
    {
        পাবলিক স্ট্যাটিক রেট তৈরি করুন (অন্তর্গত? হারের মূল্য)
        {
            যদি (! রেটভ্যালু || রেটভ্যালু == 0) 
                ফেরত নতুন নুলারেট ();
            নতুন হার ফেরান (হারের মূল্য);
        }
    }

    পাবলিক ক্লাস রেট
    {
        পাবলিক ইনট মান {পেতে; সেট }
        পাবলিক ভার্চুয়াল বোল হ্যাশভ্যালু {get {রিটার্ন (মান> 0); }}
        পাবলিক রেট (ইনট মান) = মান = মান; }
    }

    পাবলিক ক্লাস নালারেট: রেট
    {
        পাবলিক ওভাররাইড বুল হ্যাশভ্যালু {get false প্রত্যাবর্তন মিথ্যা; }}
        সর্বজনীন নালারেট (): বেস (0)}
    }
}

4
আমি মনে করি আপনি ঠিক বলেছেন যে কোনও কোনও পূর্বের স্তরের নাল মানগুলি সরিয়ে
ফেলার উপায়টি ছিল

বেপারটা এমন না. "রিফ্যাক্টরিং" নামে একটি ধারণা আছে। আপনি আপনার কোডটি একটি ভাল প্যাটার্ন বা আরও ভাল কাঠামোর দিকে রিফ্যাক্টর করতে পারেন। আপনি সর্বদা পরবর্তী পর্যায়ে অবনমিত মানগুলি নির্মূল করতে পারেন ।
নাচ

2

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

সম্পাদনা: মনে আছে, '?' কেবলমাত্র ইনউলেবল টাইপের জন্য চিনির সংকলক, সুতরাং আপনি সম্ভবত পারম হিসাবে একটি ইনল্ল্যাবল নিতে পারেন এবং তারপরে শূন্যের সাথে তুলনা করে নুল (parm == নাল) এর সাথে তুলনা করুন এবং যদি নাল না হয়।


এই বাগটি ধরার জন্য চিয়ার্স - এই প্রকল্পে আমাকে ইনট ?, ডাবল ?, দশমিক? ইত্যাদি ইত্যাদির বিরুদ্ধে পরীক্ষা করা দরকার যার কারণেই আমি "অবজেক্ট" ব্যবহার করছি
নাইলিটডাউন

মনে রেখ '?' কেবলমাত্র ইনউলেবল <টি> টাইপের জন্য চিনির সংকলক, সুতরাং আপনি সম্ভবত একটি ইনল্ল্যাবল <T> পারম হিসাবে নিতে পারেন এবং তারপরে শূন্যের সাথে তুলনা করে নুল (parm == নাল) এবং জাস্ট না হলে তুলনা করতে পারেন।
ওয়াল্ডেন লিভারিচ

0
public static bool nz(object obj)
{
    return obj == null || obj.Equals(Activator.CreateInstance(obj.GetType()));
}

4
প্রতিচ্ছবি ধীর , এই জাতীয় সমাধানগুলির সাথে সতর্ক থাকুন। আমি প্রতিবিম্বের প্রতি আপত্তি জানাই না, তবে আমি এটি "সাদামাটা" ফাংশনে এটির মতো আশা করবো না এবং এটি আমাকে প্রহরী থেকে ধরে ফেলবে।
ওয়াল্ডেন লিভারিচ

এটি কি আসলে শূন্যের জন্য পরীক্ষা করে?
নাইলিটডাউন

আসলে না. অ্যাক্টিভেটর.ক্রেইটইনস্ট্যান্স (জেজ.গেটটাইপ ()) অযোগ্য প্রকারের জন্য বাতিল হয়ে যাবে, আমি বিশ্বাস করি।
Configurator

@ কনফিগুয়েটর: যখন অণনীয় প্রকারের বাক্স করা হয়, সেগুলি অন্তর্নিহিত কাঠামো হিসাবে বক্স করা হয়, অর্থাত্ এটি কোনও শূন্য-মানগুলিকে নলাবদ্ধ করে তোলে না, তবে একটি ডিফল্ট-মূল্যবান অ-শোধনযোগ্য কাঠামো তৈরি করে না।
ইমন নের্বোন

0
class Item{  
 bool IsNullOrZero{ get{return ((this.Rate ?? 0) == 0);}}
}

আপনার সমাধানটি একটি সম্পত্তির জন্য কাজ করে, আমি নাল / শূন্য পরীক্ষা করতে একই আইটেমের অনেকগুলি বৈশিষ্ট্য নির্ধারণ করেছিলাম
নাইলিটডাউন

0

স্ট্রিংগুলির জন্য ভুলে যাবেন না, আপনি সর্বদা ব্যবহার করতে পারেন:

String.IsNullOrEmpty(str)

পরিবর্তে:

str==null || str==""

4
প্রশ্ন "0" এর সাথে তুলনা করে একটি ফাঁকা স্ট্রিং নয়।
নাচ

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