C # tương đương với hàm IsNull () trong SQL Server


113

Trong SQL Server, bạn có thể sử dụng IsNull()hàm để kiểm tra xem một giá trị có là null hay không và nếu có, hãy trả về một giá trị khác. Bây giờ tôi đang tự hỏi nếu có bất kỳ điều gì tương tự trong C #.

Ví dụ, tôi muốn làm điều gì đó như:

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

thay vì:

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

Cảm ơn.

Câu trả lời:


204

Nó được gọi là ??toán tử null thanescing ( ):

myNewValue = myValue ?? new MyValue();

3
Tôi đã cố gắng sử dụng toán tử null-thanescing nhưng vẫn nhận được lỗi Toán tử '??' không thể áp dụng cho toán hạng kiểu 'bool?' và 'int' . Lỗi đã gây hiểu nhầm. Vấn đề là tôi đang cố gắng gán một số nguyên ở vị trí toán hạng bên phải cho một biến boolean. Tôi đã phải thay đổi từ this.BinaryExists = vModel.BinaryExists ?? 0;sang this.BinaryExists = vModel.BinaryExists ?? false;.
Kuyenda

14

Đáng buồn thay, không có toán tử liên kết null nào tương đương hoạt động với DBNull; vì vậy, bạn cần sử dụng toán tử bậc ba:

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

15
Nitpick: Tôi biết nhiều nơi gọi đây là toán tử bậc ba. Hiện tại chỉ có một toán tử bậc ba, nhưng đó là thuộc tính của nó, không phải tên của nó. Nó thực sự là toán tử điều kiện. Nếu C # có được một toán tử bậc ba khác, sẽ có rất nhiều cuốn sách khó hiểu.
Jon Skeet

bạn có thể truyền dbnull đến một đối tượng ((đối tượng) oldValue ?? (đối tượng) DBNull.Value))
Jeremy Grey

1
@JeremyGray (object)oldValue ?? (object)DBNull.Value)sẽ tương đương với ((object)oldValue == null) ? (object)DBNull.Value : (object)oldValuevấn đề khác với giải pháp của Robert Rossney.
Đã thử nghiệm vào

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

myValue.isNull(new MyValue())

bằng cách này, di new MyValue()chúc sẽ được thực thi ngay cả khi myValuekhông có giá trị rỗng và không bắt buộc !!
S.Serpooshan

4

Sử dụng phương pháp Equals:

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

Câu trả lời này chỉ trả về True hoặc False, không phải là những gì OP yêu cầu.
Culme

1

Để làm việc với DB Nulls, tôi đã tạo một loạt các ứng dụng VB của mình. Tôi gọi chúng là Cxxx2 vì chúng tương tự như các hàm Cxxx tích hợp của VB.

Bạn có thể thấy chúng trong dự án Tiện ích mở rộng CLR của tôi

http://www.codeplex.com/ClrExtensions/SourceControl/FileView.aspx?itemId=363867&changeSetId=17967


Có vẻ như họ đã thay đổi tất cả các URL trên CodePlex. Hãy thử cái này: clrextensions.codeplex.com/SourceControl/changeset/view/…
Jonathan Allen

0

Bạn viết hai hàm

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

Họ làm việc rất tốt


2
Mặc dù đoạn mã này có thể giải quyết vấn đề, nhưng nó không giải thích tại sao hoặc cách nó trả lời câu hỏi. Vui lòng bao gồm giải thích cho mã của bạn , vì điều đó thực sự giúp cải thiện chất lượng bài đăng của bạn. Hãy nhớ rằng bạn đang trả lời câu hỏi cho người đọc trong tương lai và những người đó có thể không biết lý do cho đề xuất mã của bạn. Người gắn cờ / người đánh giá: Đối với các câu trả lời chỉ có mã, chẳng hạn như câu trả lời này, hãy phản đối, đừng xóa!
Luca Kiebel

0

Tôi đã sử dụng phương pháp mở rộng sau trên các loại DataRow của mình:

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

sử dụng:

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

Tôi đang kiểm tra sự tồn tại của cột trước tiên vì nếu không có kết quả truy vấn nào có giá trị khác rỗng cho cột đó, thì đối tượng DataTable thậm chí sẽ không cung cấp cột đó.


0

Sử dụng các phương pháp dưới đây.

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

Điều này có nghĩa là một nửa như một trò đùa, vì câu hỏi hơi ngớ ngẩn.

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

Đây là một phương thức mở rộng, tuy nhiên nó mở rộng System.Object, vì vậy mọi đối tượng bạn sử dụng bây giờ đều có phương thức IsNull ().

Sau đó, bạn có thể tiết kiệm hàng tấn mã bằng cách thực hiện:

if (foo.IsNull())

thay vì siêu què:

if (foo == null)

Điều này không trả lời câu hỏi.
Eric Schoonover

12
Bạn không biết ISNULL trong máy chủ sql làm gì, FlySwat.
ClayKaboom,

1
Có thể điều này hoạt động khác trong C #, nhưng tôi biết trong VB, điều này KHÔNG hoạt động để kiểm tra đối tượng là null như OP đang yêu cầu. Tôi đã thử điều này bản thân mình. Tôi chỉ tạo một phần mở rộng như vậy cho System.Object. Vấn đề là phương thức mở rộng yêu cầu một Objectđối tượng thực tế để vận hành và nếu đối tượng là Không có gì (chính xác là trường hợp bạn đang cố gắng kiểm tra trong Q này) thì không có cá thể nào để lớp mở rộng hoạt động và do đó nó sẽ ném một ngoại lệ NullObject.
eidylon,

@eidylon Có vẻ như bạn không thể truy cập phương thức mở rộng trên a Objecttrong VB. Xem câu hỏi SO này hoặc bài đăng trên blog này .
Đã thử nghiệm vào
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.