C # equivalente da função IsNull () no SQL Server


112

No SQL Server, você pode usar a IsNull()função para verificar se um valor é nulo e, se for, retornar outro valor. Agora estou me perguntando se há algo semelhante em C #.

Por exemplo, quero fazer algo como:

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

ao invés de:

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

Obrigado.

Respostas:


203

É chamado de ??operador null coalescing ( ):

myNewValue = myValue ?? new MyValue();

3
Tentei usar o operador de coalescência nula, mas continuava recebendo o erro Operador '??' não pode ser aplicado a operandos do tipo 'bool?' e 'int' . O erro foi enganoso. O problema era que eu estava tentando atribuir um int na posição do operando à direita a uma variável booleana. Eu tive que mudar de this.BinaryExists = vModel.BinaryExists ?? 0;para this.BinaryExists = vModel.BinaryExists ?? false;.
Kuyenda

14

Infelizmente, não há equivalente ao operador de coalescência nulo que funciona com DBNull; para isso, você precisa usar o operador ternário:

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

15
Nitpick: Eu sei que muitos lugares se referem a isso como o operador ternário. Acontece que há apenas um operador ternário no momento, mas é uma propriedade dele, não seu nome. É realmente o operador condicional. Se C # algum dia ganhar outro operador ternário, haverá muitos livros confusos.
Jon Skeet,

você pode lançar dbnull para um objeto ((objeto) oldValue ?? (objeto) DBNull.Value))
Jeremy Gray

1
@JeremyGray (object)oldValue ?? (object)DBNull.Value)seria equivalente, o ((object)oldValue == null) ? (object)DBNull.Value : (object)oldValueque é diferente do problema que a solução de Robert Rossney aborda.
Trisped

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

myValue.isNull(new MyValue())

desta forma, o new MyValue()será executado mesmo quando myValuenão for nulo e não for obrigatório !!
S.Serpooshan

4

Use o método Equals:

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

Essa resposta retorna apenas True ou False, que não é o que o OP pediu.
Culme


0

Você escreve duas funções

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

Eles funcionam muito bem


2
Embora este trecho de código possa resolver o problema, ele não explica por que ou como responde à pergunta. Por favor incluir uma explicação para o seu código , como o que realmente ajuda a melhorar a qualidade do seu post. Lembre-se de que você está respondendo a pergunta para leitores no futuro, e essas pessoas podem não saber os motivos de sua sugestão de código. Sinalizadores / revisores: para respostas apenas com código, como esta, faça downvote, não exclua!
Luca Kiebel

0

Tenho usado o seguinte método de extensão em meus 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");

Estou verificando a existência da coluna primeiro, porque se nenhum dos resultados da consulta tiver um valor não nulo para essa coluna, o objeto DataTable nem mesmo fornecerá essa coluna.


0

Use os métodos abaixo.

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

Isso é meio que uma piada, já que a pergunta é meio boba.

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

Este é um método de extensão, no entanto, estende System.Object, então cada objeto que você usa agora tem um método IsNull ().

Então você pode salvar toneladas de código fazendo:

if (foo.IsNull())

em vez do super coxo:

if (foo == null)

Isso não responde à pergunta.
Eric Schoonover,

12
Você não sabe o que ISNULL em sql server faz, FlySwat.
ClayKaboom

1
Talvez isso funcione de forma diferente em C #, mas eu sei que em VB isso NÃO funcionaria para testar se o objeto é nulo, pois o OP está perguntando sobre. Eu tentei isso sozinho. Fiz exatamente essa extensão para System.Object. O problema é que o método de extensão requer um Objectobjeto real sobre o qual operar, e se o objeto fosse Nothing (precisamente o caso que você está tentando testar neste Q) não havia instância para a classe de extensão operar e, portanto, lançar uma exceção NullObject.
eidylon

@eidylon Parece que você não pode acessar um método de extensão em um Objectem VB. Veja esta pergunta do SO ou esta postagem do blog .
Trisped
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.