C # setara dengan fungsi IsNull () di SQL Server


113

Di SQL Server, Anda dapat menggunakan IsNull()fungsi untuk memeriksa apakah suatu nilai adalah null, dan jika ya, mengembalikan nilai lain. Sekarang saya bertanya-tanya apakah ada yang serupa di C #.

Misalnya, saya ingin melakukan sesuatu seperti:

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

dari pada:

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

Terima kasih.

Jawaban:


204

Ini disebut ??operator penggabungan nol ( ):

myNewValue = myValue ?? new MyValue();

3
Saya mencoba menggunakan operator penggabungan nol tetapi terus mendapatkan Operator kesalahan '??' tidak dapat diterapkan ke operan tipe 'bool?' dan 'int' . Kesalahan itu menyesatkan. Masalahnya adalah saya mencoba untuk menetapkan int di posisi operan kanan ke variabel boolean. Saya harus berubah dari this.BinaryExists = vModel.BinaryExists ?? 0;menjadi this.BinaryExists = vModel.BinaryExists ?? false;.
Kuyenda

14

Sayangnya, tidak ada operator penggabungan nol yang bekerja dengan DBNull; untuk itu, Anda perlu menggunakan operator terner:

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

15
Nitpick: Saya tahu banyak tempat menyebut ini sebagai operator terner. Saat ini hanya ada satu operator terner, tetapi itu adalah propertinya, bukan namanya. Ini benar-benar operator bersyarat. Jika C # pernah mendapatkan operator terner lain, akan ada banyak buku yang membingungkan.
Jon Skeet

Anda dapat melemparkan dbnull ke objek ((object) oldValue ?? (object) DBNull.Value))
Jeremy Grey

1
@JeremyGray (object)oldValue ?? (object)DBNull.Value)akan sama dengan ((object)oldValue == null) ? (object)DBNull.Value : (object)oldValueperbedaan masalah yang ditangani oleh solusi Robert Rossney.
Dicabut

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

myValue.isNull(new MyValue())

dengan cara ini, new MyValue()akan dieksekusi bahkan ketika myValuebukan nol dan tidak diperlukan !!
S. Serpooshan

4

Gunakan metode Equals:

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

Jawaban ini hanya mengembalikan Benar atau Salah, yang tidak diminta oleh OP.
Culme


0

Anda Menulis Dua Fungsi

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

Mereka Bekerja Dengan Sangat Baik


2
Meskipun cuplikan kode ini dapat menyelesaikan masalah, cuplikan kode ini tidak menjelaskan mengapa atau bagaimana menjawab pertanyaan tersebut. Harap sertakan penjelasan untuk kode Anda , karena itu sangat membantu meningkatkan kualitas posting Anda. Ingatlah bahwa Anda menjawab pertanyaan untuk pembaca di masa mendatang, dan orang-orang itu mungkin tidak tahu alasan saran kode Anda. Penanda / peninjau: Untuk jawaban hanya kode seperti ini, downvote, jangan hapus!
Luca Kiebel

0

Saya telah menggunakan metode ekstensi berikut pada jenis DataRow saya:

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

pemakaian:

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

Saya memeriksa keberadaan kolom terlebih dahulu karena jika tidak ada hasil kueri yang memiliki nilai bukan nol untuk kolom itu, objek DataTable bahkan tidak akan menyediakan kolom itu.


0

Gunakan metode di bawah ini.

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

Ini berarti setengah lelucon, karena pertanyaannya agak konyol.

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

Ini adalah metode ekstensi, namun ia memperluas System.Object, jadi setiap objek yang Anda gunakan sekarang memiliki metode IsNull ().

Kemudian Anda dapat menghemat banyak kode dengan melakukan:

if (foo.IsNull())

bukan yang super timpang:

if (foo == null)

Ini tidak menjawab pertanyaan itu.
Eric Schoonover

12
Anda tidak tahu apa yang dilakukan ISNULL di sql server, FlySwat.
ClayKaboom

1
Mungkin ini bekerja secara berbeda di C #, tapi saya tahu di VB ini TIDAK akan berfungsi untuk menguji objek null seperti yang ditanyakan OP. Saya mencoba ini sendiri. Saya membuat ekstensi seperti itu ke System.Object. Masalahnya adalah metode ekstensi memerlukan Objectobjek aktual untuk beroperasi, dan jika objek tersebut adalah Nothing (tepatnya kasus yang Anda coba uji dalam Q ini) tidak ada contoh untuk kelas ekstensi untuk beroperasi dan dengan demikian akan melempar pengecualian NullObject.
eidylon

@eidylon Sepertinya Anda tidak dapat mengakses metode ekstensi di Objectdalam VB. Lihat pertanyaan SO ini atau posting blog ini .
Dicabut
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.