C # odpowiednik funkcji IsNull () w SQL Server


113

W SQL Server możesz użyć tej IsNull()funkcji, aby sprawdzić, czy wartość jest pusta, a jeśli tak, zwrócić inną wartość. Teraz zastanawiam się, czy w C # jest coś podobnego.

Na przykład chcę zrobić coś takiego:

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

zamiast:

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

Dzięki.

Odpowiedzi:


204

Nazywa się to ??operatorem koalescencji zerowej ( ):

myNewValue = myValue ?? new MyValue();

3
Próbowałem użyć operatora łączącego wartości null, ale nadal otrzymywałem błąd Operator „??” nie można zastosować do operandów typu „bool?” i „int” . Błąd wprowadzał w błąd. Problem polegał na tym, że próbowałem przypisać wartość int w pozycji operandu po prawej stronie do zmiennej boolowskiej. Musiałem zmienić z this.BinaryExists = vModel.BinaryExists ?? 0;na this.BinaryExists = vModel.BinaryExists ?? false;.
Kuyenda,

14

Niestety, nie ma odpowiednika operatora koalescencji zerowej, który działa z DBNull; w tym celu musisz użyć operatora trójskładnikowego:

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

15
Nitpick: Wiem, że wiele miejsc nazywa to operatorem trójskładnikowym. W tej chwili jest tylko jeden operator trójskładnikowy, ale jest to jego własność, a nie jego nazwa. To naprawdę operator warunkowy. Jeśli C # kiedykolwiek uzyska kolejny operator trójskładnikowy, będzie wiele zagmatwanych książek.
Jon Skeet

możesz rzutować dbnull na obiekt ((object) oldValue ?? (object) DBNull.Value))
Jeremy Gray

1
@JeremyGray (object)oldValue ?? (object)DBNull.Value)byłoby równoważne z ((object)oldValue == null) ? (object)DBNull.Value : (object)oldValueczym innym jest problem, którego dotyczy rozwiązanie Roberta Rossneya.
Trisped

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

myValue.isNull(new MyValue())

w ten sposób new MyValue()zostanie wykonana nawet wtedy, gdy myValuenie jest zerowa i nie jest wymagana !!
S.Serpooshan

4

Użyj metody Equals:

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

Ta odpowiedź zwraca tylko Prawda lub Fałsz, co nie jest tym, o co prosił OP.
Culme


0

Piszesz dwie funkcje

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

Działają bardzo dobrze


2
Chociaż ten fragment kodu może rozwiązać problem, nie wyjaśnia, dlaczego ani jak odpowiada na pytanie. Dołącz wyjaśnienie swojego kodu , ponieważ naprawdę pomaga to poprawić jakość Twojego postu. Pamiętaj, że odpowiadasz na pytanie do czytelników w przyszłości, a osoby te mogą nie znać powodów, dla których zaproponowałeś kod. Osoby zgłaszające / recenzenci: w przypadku odpowiedzi zawierających tylko kod, takich jak ta, głosuj przeciw, nie usuwaj!
Luca Kiebel

0

Używałem następującej metody rozszerzenia na moich typach 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;
    }

stosowanie:

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

Najpierw sprawdzam istnienie kolumny, ponieważ jeśli żaden z wyników zapytania nie ma wartości innej niż null dla tej kolumny, obiekt DataTable nawet nie zapewni tej kolumny.


0

Użyj poniższych metod.

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

To ma być w połowie żartem, ponieważ pytanie jest trochę głupie.

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

Jest to metoda rozszerzająca, jednak rozszerza System.Object, więc każdy używany obiekt ma teraz metodę IsNull ().

Następnie możesz zaoszczędzić mnóstwo kodu, wykonując:

if (foo.IsNull())

zamiast super kulawego:

if (foo == null)

To nie odpowiada na pytanie.
Eric Schoonover

12
Nie wiesz, co robi ISNULL na serwerze sql, FlySwat.
ClayKaboom

1
Może to działa inaczej w C #, ale wiem, że w VB to NIE zadziała do testowania, że ​​obiekt jest zerowy, o który pyta OP. Sam tego próbowałem. Właśnie zrobiłem takie rozszerzenie do System.Object. Problem polega na tym, że metoda rozszerzenia wymaga rzeczywistego Objectobiektu, na którym ma działać, a jeśli obiekt byłby Nothing (dokładnie w przypadku, w którym próbujesz przetestować w tym Q), nie byłoby instancji dla klasy rozszerzającej, na której mogłaby działać, a zatem zgłoś wyjątek NullObject.
eidylon

@eidylon Wygląda na to, że nie możesz uzyskać dostępu do metody rozszerzenia Objectw VB. Zobacz to pytanie SO lub ten wpis na blogu .
Trisped
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.