Équivalent C # de la fonction IsNull () dans SQL Server


113

Dans SQL Server, vous pouvez utiliser le IsNull() fonction pour vérifier si une valeur est nulle et, le cas échéant, renvoyer une autre valeur. Maintenant, je me demande s'il y a quelque chose de similaire en C #.

Par exemple, je veux faire quelque chose comme:

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

au lieu de:

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

Merci.

Réponses:


204

C'est ce qu'on appelle l' ??opérateur null coalescing ( ):

myNewValue = myValue ?? new MyValue();

3
J'ai essayé d'utiliser l'opérateur null-coalescing mais j'ai continué à obtenir l'erreur Operator '??' ne peut pas être appliqué aux opérandes de type 'bool?' et 'int' . L'erreur était trompeuse. Le problème était que j'essayais d'assigner un int dans la position d'opérande de droite à une variable booléenne. J'ai dû changer de this.BinaryExists = vModel.BinaryExists ?? 0;à this.BinaryExists = vModel.BinaryExists ?? false;.
Kuyenda

14

Malheureusement, il n'y a pas d'équivalent à l'opérateur de fusion nul qui fonctionne avec DBNull; pour cela, vous devez utiliser l'opérateur ternaire:

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

15
Nitpick: Je sais que beaucoup d'endroits appellent cela l'opérateur ternaire. Il se trouve qu'il n'y a qu'un seul opérateur ternaire pour le moment, mais c'est une propriété de celui-ci, pas son nom. C'est vraiment l'opérateur conditionnel. Si C # gagne un autre opérateur ternaire, il y aura beaucoup de livres déroutants.
Jon Skeet

vous pouvez convertir dbnull en un objet ((objet) oldValue ?? (object) DBNull.Value))
Jeremy Gray

1
@JeremyGray (object)oldValue ?? (object)DBNull.Value)équivaudrait à ((object)oldValue == null) ? (object)DBNull.Value : (object)oldValuece que le problème aborde dans la solution de Robert Rossney.
Trisped le

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

myValue.isNull(new MyValue())

de cette façon, le new MyValue()sera exécuté même s'il myValuen'est pas nul et qu'il n'est pas obligatoire !!
S.Serpooshan

4

Utilisez la méthode Equals:

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

Cette réponse ne renvoie que Vrai ou Faux, ce qui n'est pas ce que l'OP a demandé.
Culme


0

Vous écrivez deux fonctions

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

Ils fonctionnent très bien


2
Bien que cet extrait de code puisse résoudre le problème, il n'explique pas pourquoi ni comment il répond à la question. Veuillez inclure une explication de votre code , car cela contribue vraiment à améliorer la qualité de votre message. N'oubliez pas que vous répondez à la question aux lecteurs à l'avenir, et que ces personnes pourraient ne pas connaître les raisons de votre suggestion de code. Signaleurs / réviseurs: pour les réponses de code uniquement comme celle-ci, votez contre, ne supprimez pas!
Luca Kiebel

0

J'ai utilisé la méthode d'extension suivante sur mes types 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;
    }

usage:

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

Je vérifie d'abord l'existence de la colonne car si aucun des résultats de la requête n'a une valeur non nulle pour cette colonne, l'objet DataTable ne fournira même pas cette colonne.


0

Utilisez les méthodes ci-dessous.

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

Ceci est considéré à moitié comme une blague, car la question est un peu ridicule.

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

C'est une méthode d'extension, mais elle étend System.Object, donc chaque objet que vous utilisez a maintenant une méthode IsNull ().

Ensuite, vous pouvez enregistrer des tonnes de code en faisant:

if (foo.IsNull())

au lieu du super boiteux:

if (foo == null)

Cela ne répond pas à la question.
Eric Schoonover

12
Vous ne savez pas ce que fait ISNULL dans le serveur SQL, FlySwat.
ClayKaboom

1
Peut-être que cela fonctionne différemment en C #, mais je sais qu'en VB cela ne fonctionnerait PAS pour tester l'objet est nul comme l'OP le demande. J'ai essayé moi-même. J'ai fait une telle extension à System.Object. Le problème est que la méthode d'extension nécessite un Objectobjet réel sur lequel opérer, et si l'objet était Nothing (précisément le cas que vous essayez de tester dans ce Q) il n'y avait aucune instance sur laquelle la classe d'extension fonctionnerait et donc lancer une exception NullObject.
eidylon

@eidylon On dirait que vous ne pouvez pas accéder à une méthode d'extension sur un Objectdans VB. Voir cette question SO ou ce billet de blog .
Trisped le
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.