سؤال

في SQL Server ، يمكنك استخدام IsNull() وظيفة للتحقق مما إذا كانت القيمة لاغية ، وإذا كانت ، إرجاع قيمة أخرى. الآن أتساءل عما إذا كان هناك أي شيء مشابه في C#.

على سبيل المثال ، أريد أن أفعل شيئًا مثل:

myNewValue = IsNull(myValue, new MyValue());

بدلاً من:

if (myValue == null)
  myValue = new MyValue();
myNewValue = myValue;

شكرًا.

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

المحلول

يطلق عليه الفحم الفارغ (??) المشغل أو العامل:

myNewValue = myValue ?? new MyValue();

نصائح أخرى

للأسف ، ليس هناك ما يعادل مشغل الفحم الفارغ الذي يعمل مع dbnull ؛ لذلك ، تحتاج إلى استخدام المشغل الثلاثية:

newValue = (oldValue is DBNull) ? null : oldValue;

استخدم طريقة متساوية:

object value2 = null;
Console.WriteLine(object.Equals(value2,null));
public static T isNull<T>(this T v1, T defaultValue)
{
    return v1 == null ? defaultValue : v1;
}

myValue.isNull(new MyValue())

للعمل مع DB Nulls ، قمت بإنشاء حفنة لتطبيقات VB الخاصة بي. أسميهم CXXX2 لأنها تشبه وظائف CXXX المدمجة في VB.

يمكنك رؤيتها في مشروع ملحقات CLR الخاص بي

http://www.codeplex.com/clrextensions/sourcecontrol/fileview.aspx؟itemid=363867&Changesetid=17967

تكتب وظيفتين

    //When Expression is Number
    public static double? isNull(double? Expression, double? Value)
    {
        if (Expression ==null)
        {
            return Value;
        }
        else
        {
            return Expression;
        }
    }


    //When Expression is string (Can not send Null value in string Expression
    public static string isEmpty(string Expression, string Value)
    {
        if (Expression == "")
        {
            return Value;
        }
        else
        {
            return Expression;
        }
    }

إنهم يعملون بشكل جيد للغاية

لقد كنت أستخدم طريقة التمديد التالية على أنواع DataRow الخاصة بي:

    public static string ColumnIsNull(this System.Data.DataRow row, string colName, string defaultValue = "")
    {
        string val = defaultValue;
        if (row.Table.Columns.Contains(colName))
        {
            if (row[colName] != DBNull.Value)
            {
                val = row[colName]?.ToString();
            }
        }
        return val;
    }

الاستخدام:

MyControl.Text = MyDataTable.Rows[0].ColumnIsNull("MyColumn");
MyOtherControl.Text = MyDataTable.Rows[0].ColumnIsNull("AnotherCol", "Doh! I'm null");

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

استخدام الأساليب أدناه.

    /// <summary>
    /// Returns replacement value if expression is null
    /// </summary>
    /// <param name="expression"></param>
    /// <param name="replacement"></param>
    /// <returns></returns>
    public static long? IsNull(long? expression, long? replacement)
    {
        if (expression.HasValue)
            return expression;
        else
            return replacement;
    }

    /// <summary>
    /// Returns replacement value if expression is null
    /// </summary>
    /// <param name="expression"></param>
    /// <param name="replacement"></param>
    /// <returns></returns>
    public static string IsNull(string expression, string replacement)
    {
        if (string.IsNullOrWhiteSpace(expression))
            return replacement;
        else
            return expression;
    }

هذا يعني نصف مزحة ، لأن السؤال سخيف نوعا ما.

public static bool IsNull (this System.Object o)
{
   return (o == null);
}

هذه طريقة تمديد ، ومع ذلك فهي تمتد System.Object ، لذلك كل كائن تستخدمه الآن لديه طريقة ISNull ().

ثم يمكنك حفظ أطنان من التعليمات البرمجية عن طريق القيام:

if (foo.IsNull())

بدلا من العرجاء السوبر:

if (foo == null)
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top