أنواع لاغية:أفضل طريقة للتحقق من وجود صفر أو فارغة في C#

StackOverflow https://stackoverflow.com/questions/633286

  •  08-07-2019
  •  | 
  •  

سؤال

أنا أعمل في مشروع حيث أجد أنني أتحقق مما يلي في العديد من الأماكن:

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);
}

هل هناك طريقة أفضل؟

هل كانت مفيدة؟

المحلول

انا يعجبني if ((item.Rate ?? 0) == 0) { }

التحديث 1:

يمكنك أيضًا تحديد طريقة تمديد مثل:

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

واستخدامها مثل هذا:

if(item.IsNullOrValue(0)){} // لكنك لا تحصل على الكثير منه

نصائح أخرى

وعن طريق الوراثة:

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) هو 0D، لمنطقي هو false، لشار غير '\0' وهلم جرا ...

على الرغم من أنني أحب الإجابة المقبولة تمامًا، إلا أنني أعتقد أنه من أجل الاكتمال، يجب ذكر هذا الخيار أيضًا:

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

هذا الحل


¹ لا ينبغي أن يؤثر هذا على قرارك، نظرًا لأن هذه الأنواع من التحسين الجزئي من غير المرجح أن تحدث أي فرق.

هذا في الحقيقة مجرد توسيع لإجابة فريدي ريوس المقبولة فقط باستخدام الأدوية العامة.

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));
}

ملحوظة لا نحتاج إلى التحقق من القيمة الافتراضية (T) للقيمة الخالية لأننا نتعامل مع أنواع القيم أو البنيات!وهذا يعني أيضًا أنه يمكننا أن نفترض بأمان أن T valueToCheck لن تكون فارغة؛تذكر هنا أن T؟هو اختصار Nullable<T> لذلك بإضافة الامتداد إلى Nullable<T> نحصل على الطريقة int?, double?, bool?إلخ.

أمثلة:

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

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

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

وأنا أتفق مع استخدام ؟؟ المشغل أو العامل.

إذا كنت تتعامل مع سلاسل استخدامها في حالة (String.IsNullOrEmpty (myStr))

<اقتباس فقرة>   

وهناك طريقة أفضل؟

حسنا، إذا كنت حقا تبحث عن طريقة أفضل، ربما يمكنك إضافة طبقة أخرى من التجريد على رأس أسعار. حسنا هنا هو شيء جئت للتو باستخدام قيم الفارغة تصميم نمط.

using System;
using System.Collections.Generic;

namespace NullObjectPatternTest
{
    public class Program
    {
        public static void Main(string[] args)
        {
            var items = new List
                            {
                                new Item(RateFactory.Create(20)),
                                new Item(RateFactory.Create(null))
                            };

            PrintPricesForItems(items);
        }

        private static void PrintPricesForItems(IEnumerable items)
        {
            foreach (var item in items)
                Console.WriteLine("Item Price: {0:C}", item.GetPrice());
        }
    }

    public abstract class ItemBase
    {
        public abstract Rate Rate { get; }
        public int GetPrice()
        {
            // There is NO need to check if Rate == 0 or Rate == null
            return 1 * Rate.Value;
        }
    }

    public class Item : ItemBase
    {
        private readonly Rate _Rate;
        public override Rate Rate { get { return _Rate; } }
        public Item(Rate rate) { _Rate = rate; }
    }

    public sealed class RateFactory
    {
        public static Rate Create(int? rateValue)
        {
            if (!rateValue || rateValue == 0) 
                return new NullRate();
            return new Rate(rateValue);
        }
    }

    public class Rate
    {
        public int Value { get; set; }
        public virtual bool HasValue { get { return (Value > 0); } }
        public Rate(int value) { Value = value; }
    }

    public class NullRate : Rate
    {
        public override bool HasValue { get { return false; } }
        public NullRate() : base(0) { }
    }
}

وستفشل نموذج التعليمات البرمجية أنت. إذا الكائنات فارغ ثم فإن obj.ToString () يؤدي إلى استثناء مرجع فارغة. كنت قد اختصر العملية والتحقق من وجود الكائنات اغية في بداية الدالة المساعد الخاص بك. أما بالنسبة لمسألة الفعلي، ما هو نوع كنت التحقق من وجود خالية أو الصفر؟ في سلسلة هناك وظيفة IsNullOrEmpty كبيرة، ويبدو لي أن هذا سيكون فائدة كبيرة من طرق الإرشاد لتنفيذ طريقة IsNullOrZero على الباحث؟ نوع.

وتحرير: تذكر، و'؟ هو عادل السكر مترجم لنوع INullable، لذلك يمكن أن ربما تأخذ INullable كما PARM ثم jsut ذلك لمقارنة فارغة (PARM == فارغة) وإذا لم يكن لاغية مقارنة إلى الصفر.

public static bool nz(object obj)
{
    return obj == null || obj.Equals(Activator.CreateInstance(obj.GetType()));
}
class Item{  
 bool IsNullOrZero{ get{return ((this.Rate ?? 0) == 0);}}
}

لا تنسى، وسلاسل، يمكنك دائما استخدام:

String.IsNullOrEmpty(str)

وبدلا من:

str==null || str==""
scroll top