C#等效于SQL Server中的IsNull()函数


113

在SQL Server中,您可以使用 IsNull()函数检查值是否为null,如果为空,则返回另一个值。现在我想知道C#中是否有任何类似的东西。

例如,我想做类似的事情:

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

代替:

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

谢谢。

Answers:


204

称为空合并(??)运算符:

myNewValue = myValue ?? new MyValue();

3
我尝试使用null-coalescing运算符,但始终收到错误运算符'??' 不能应用于类型为“布尔”的操作数?和'int'。错误是令人误解的。问题是我试图将一个在右侧操作数位置的int分配给一个布尔变量。我必须从更改this.BinaryExists = vModel.BinaryExists ?? 0;this.BinaryExists = vModel.BinaryExists ?? false;
Kuyenda 2011年

14

可悲的是,没有等效于与DBNull一起使用的null合并运算符。为此,您需要使用三元运算符:

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

15
Nitpick:我知道很多地方都将此称为三元运算符。目前恰好只有一个三元运算符,但这是它的一个属性,而不是它的名称。它实际上是条件运算符。如果C#获得了另一个三元运算符,将会有很多令人困惑的书。
乔恩·斯基特

您可以将dbnull强制转换为对象((object)oldValue ??(object)DBNull.Value))
Jeremy Gray

1
@JeremyGray (object)oldValue ?? (object)DBNull.Value)((object)oldValue == null) ? (object)DBNull.Value : (object)oldValue与Robert Rossney的解决方案所解决的问题不同。
2013年

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

myValue.isNull(new MyValue())

这样,new MyValue()即使myValue不为null并且不需要时,也将执行!!
S.Serpooshan



0

你写两个函数

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

他们工作得很好


2
尽管此代码段可以解决问题,但并未说明原因或答案。请附上代码说明,因为这确实有助于提高您的帖子质量。请记住,您将来会为读者回答这个问题,而这些人可能不知道您提出代码建议的原因。 举报人/审阅者: 对于仅限代码的答案,例如这一答案,请表决,不要删除!
卡·基贝尔

0

我一直在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;
    }

用法:

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

我首先检查该列是否存在,因为如果查询结果中没有该列的非null值,则DataTable对象甚至不会提供该列。


0

使用以下方法。

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

这只是开个玩笑,因为问题有点傻。

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

这是一个扩展方法,但是它扩展了System.Object,因此您现在使用的每个对象都有一个IsNull()方法。

然后,您可以通过执行以下操作来节省大量代码:

if (foo.IsNull())

而不是超级la脚:

if (foo == null)

这不能回答问题。
Eric Sc​​hoonover,

12
您不知道SQL Server中的ISNULL是什么,FlySwat。
ClayKaboom 2011年

1
也许这在C#中的工作方式有所不同,但是我知道在VB中,这不适合测试OP询问的对象是否为null。我自己尝试过。我对System.Object做了这样的扩展。问题在于扩展方法需要Object在其上运行的实际对象,并且如果该对象为Nothing(恰恰是您要在此Q中测试的情况),则扩展类没有实例可操作,因此它将抛出NullObject异常。
eidylon

@eidylon看起来您无法Object在VB中访问扩展方法。请参阅此SO问题此博文
Trisped 2013年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.