Equivalente en C # de la función IsNull () en SQL Server


113

En SQL Server, puede usar la IsNull()función para verificar si un valor es nulo y, si lo es, devolver otro valor. Ahora me pregunto si hay algo similar en C #.

Por ejemplo, quiero hacer algo como:

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

en vez de:

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

Gracias.

Respuestas:


204

Se llama ??operador coalescente nulo ( ):

myNewValue = myValue ?? new MyValue();

3
Intenté usar el operador de fusión nula pero seguí recibiendo el error Operador '??' no se puede aplicar a operandos de tipo 'bool?' e 'int' . El error fue engañoso. El problema era que estaba tratando de asignar un int en la posición del operando de la derecha a una variable booleana. Tuve que cambiar de this.BinaryExists = vModel.BinaryExists ?? 0;a this.BinaryExists = vModel.BinaryExists ?? false;.
Kuyenda

14

Lamentablemente, no hay equivalente al operador de fusión nula que funciona con DBNull; para eso, necesitas usar el operador ternario:

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

15
Nitpick: Sé que muchos lugares se refieren a esto como el operador ternario. Resulta que solo hay un operador ternario en este momento, pero eso es una propiedad de él, no su nombre. Realmente es el operador condicional. Si C # alguna vez gana otro operador ternario, habrá muchos libros confusos.
Jon Skeet

puede convertir dbnull a un objeto ((object) oldValue ?? (object) DBNull.Value))
Jeremy Gray

1
@JeremyGray (object)oldValue ?? (object)DBNull.Value)sería equivalente a ((object)oldValue == null) ? (object)DBNull.Value : (object)oldValuecuál es el problema que aborda la solución de Robert Rossney.
Trisped

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

myValue.isNull(new MyValue())

de esta manera, new MyValue()se ejecutará incluso cuando myValueno sea nulo y no sea necesario.
S.Serpooshan

4

Utilice el método Equals:

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

Esta respuesta solo devuelve Verdadero o Falso, que no es lo que pidió el OP.
Culme


0

Escribe dos funciones

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

Funcionan muy bien


2
Si bien este fragmento de código puede resolver el problema, no explica por qué ni cómo responde a la pregunta. Por favor, incluya una explicación de su código , como que realmente ayuda a mejorar la calidad de su puesto. Recuerde que está respondiendo a la pregunta para los lectores en el futuro, y es posible que esas personas no conozcan los motivos de su sugerencia de código. Marcadores / revisores: para respuestas de solo código como esta, ¡no elimine!
Luca Kiebel

0

He estado usando el siguiente método de extensión en mis tipos de 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;
    }

uso:

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

Primero estoy verificando la existencia de la columna porque si ninguno de los resultados de la consulta tiene un valor no nulo para esa columna, el objeto DataTable ni siquiera proporcionará esa columna.


0

Utilice los métodos siguientes.

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

Esto se entiende a medias como una broma, ya que la pregunta es un poco tonta.

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

Este es un método de extensión, sin embargo, extiende System.Object, por lo que cada objeto que usa ahora tiene un método IsNull ().

Entonces puedes guardar toneladas de código haciendo:

if (foo.IsNull())

en lugar del super cojo:

if (foo == null)

Esto no responde a la pregunta.
Eric Schoonover

12
No sabes lo que hace ISNULL en el servidor SQL, FlySwat.
ClayKaboom

1
Tal vez esto funcione de manera diferente en C #, pero sé que en VB esto NO funcionaría para probar que el objeto es nulo, ya que el OP está preguntando. Probé esto yo mismo. Hice tal extensión para System.Object. El problema es que el método de extensión requiere un Objectobjeto real sobre el cual operar, y si el objeto fuera Nada (precisamente el caso que está tratando de probar en esta Q) no había ninguna instancia para que la clase de extensión operara y, por lo tanto, sería lanzar una excepción NullObject.
Eidylon

@eidylon Parece que no puede acceder a un método de extensión en un ObjectVB. Vea esta pregunta SO o esta publicación de blog .
Trisped
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.