SQL Server'da IsNull () işlevinin C # eşdeğeri


113

SQL Server'da IsNull()bir değerin boş olup olmadığını kontrol etmek için işlevi kullanabilir ve eğer öyleyse başka bir değer döndürebilirsiniz. Şimdi C # 'da benzer bir şey olup olmadığını merak ediyorum.

Örneğin, şöyle bir şey yapmak istiyorum:

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

onun yerine:

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

Teşekkürler.

Yanıtlar:


204

Boş coalescing ( ??) operatörü olarak adlandırılır:

myNewValue = myValue ?? new MyValue();

3
Boş birleştirme operatörünü kullanmayı denedim, ancak Operatör '??' hatasını almaya devam ettim. 'bool?' türündeki işlenenlere uygulanamaz ve 'int' . Hata yanıltıcıydı. Sorun, sağ taraftaki işlenen konumunda bir boole değişkenine bir int atamaya çalışmamdı. Ben değiştirmek zorunda this.BinaryExists = vModel.BinaryExists ?? 0;için this.BinaryExists = vModel.BinaryExists ?? false;.
Kuyenda

14

Ne yazık ki, DBNull ile çalışan boş birleştirme operatörünün eşdeğeri yoktur; bunun için üçlü operatörü kullanmanız gerekir:

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

15
Nitpick: Pek çok yerde bundan üçlü operatör olarak bahsettiğini biliyorum. Şu anda yalnızca bir tane üçlü operatör var, ama bu onun bir özelliği, adı değil. Gerçekten şartlı operatör. C # başka bir üçlü operatör kazanırsa, birçok kafa karıştırıcı kitap olacaktır.
Jon Skeet

dbnull'u bir nesneye ((nesne) oldValue ?? (nesne) DBNull.Value)) çevirebilirsiniz
Jeremy Gray

1
@JeremyGray (object)oldValue ?? (object)DBNull.Value), ((object)oldValue == null) ? (object)DBNull.Value : (object)oldValueRobert Rossney'nin çözümünün ele aldığı problemin farklı olduğu bir eşit olacaktır .
2013

5
public static T isNull<T>(this T v1, T defaultValue)
{
    return v1 == null ? defaultValue : v1;
}

myValue.isNull(new MyValue())

bu şekilde, boş olmadığında new MyValue()bile çalıştırılacaktır myValueve gerekli değildir !!
S.Serpooshan

4

Eşittir yöntemini kullanın:

object value2 = null;
Console.WriteLine(object.Equals(value2,null));

Bu yanıt yalnızca Doğru veya Yanlış döndürür, bu OP'nin istediği şey değildir.
Culme


0

İki Fonksiyon Yazıyorsun

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

Çok İyi Çalışıyorlar


2
Bu kod parçacığı sorunu çözebilir ancak soruyu neden veya nasıl yanıtladığını açıklamaz. Lütfen kodunuz için bir açıklamaya yer gerçekten Yayınınızla kalitesini artırmak için yardımcı olarak,. Gelecekte okuyucular için soruyu yanıtladığınızı ve bu kişilerin kod önerinizin nedenlerini bilmeyebileceklerini unutmayın. İşaretleyiciler / gözden geçirenler: Bunun gibi yalnızca kod içeren yanıtlar için, olumsuz oy verin, silmeyin!
Luca Kiebel

0

DataRow türlerimde aşağıdaki uzantı yöntemini kullanıyorum:

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

kullanımı:

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

Önce sütunun varlığını kontrol ediyorum çünkü sorgu sonuçlarından hiçbiri bu sütun için boş olmayan bir değere sahip değilse, DataTable nesnesi o sütunu bile sağlamaz.


0

Aşağıdaki yöntemleri kullanın.

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

0
    public static T IsNull<T>(this T DefaultValue, T InsteadValue)
    {

        object obj="kk";

        if((object) DefaultValue == DBNull.Value)
        {
            obj = null;
        }

        if (obj==null || DefaultValue==null || DefaultValue.ToString()=="")
        {
            return InsteadValue;
        }
        else
        {
            return DefaultValue;
        }

    }

//This method can work with DBNull and null value. This method is question's answer

-10

Soru biraz saçma olduğu için bunun yarısı şaka anlamına geliyor.

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

Bu bir genişletme yöntemidir, ancak System.Object öğesini genişletir, bu nedenle artık kullandığınız her nesnenin bir IsNull () yöntemi vardır.

Ardından şunları yaparak tonlarca kod tasarrufu yapabilirsiniz:

if (foo.IsNull())

süper topal yerine:

if (foo == null)

Bu soruya cevap vermiyor.
Eric Schoonover

12
Sql sunucusunda ISNULL'un ne yaptığını bilmiyorsunuz FlySwat.
ClayKaboom

1
Belki bu C # 'da farklı çalışır, ancak VB'de bunun OP'nin sorduğu gibi nesnenin boş olduğunu test etmek için işe yaramayacağını biliyorum. Bunu kendim denedim. System.Object için böyle bir uzantı yaptım. Sorun, genişletme yönteminin Objectüzerinde çalışacağı gerçek bir nesneyi gerektirmesidir ve nesne Hiçbir Şey ise (tam olarak bu Q'da test etmeye çalıştığınız durum), uzantı sınıfının üzerinde çalışacağı bir örnek yoktur ve bu nedenle bir NullObject istisnası oluşturun.
eidylon

@eidylon Görünüşe göre VB'de bir uzatma yöntemine erişemiyorsunuz Object. Bkz bu SO soru veya bu blog yazısı .
2013 0
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.