C#相当于SQL Server中的IsNull()函数

C#相当于SQL Server中的IsNull()函数,c#,.net,sql-server,isnull,C#,.net,Sql Server,Isnull,在SQL Server中,可以使用IsNull()函数检查值是否为null,如果为null,则返回另一个值。现在我想知道C#中是否有类似的东西 例如,我想做如下事情: myNewValue = IsNull(myValue, new MyValue()); 而不是: if (myValue == null) myValue = new MyValue(); myNewValue = myValue; 谢谢。它被称为空合并(??)运算符: myNewValue = myValue ?? n

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

例如,我想做如下事情:

myNewValue = IsNull(myValue, new MyValue());
而不是:

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

谢谢。

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

myNewValue = myValue ?? new MyValue();
newValue = (oldValue is DBNull) ? null : oldValue;

遗憾的是,没有与使用DBNull的null合并操作符等价的操作符;为此,需要使用三元运算符:

myNewValue = myValue ?? new MyValue();
newValue = (oldValue is DBNull) ? null : oldValue;

为了使用DB空值,我为我的VB应用程序创建了一组。我称它们为Cxxx2,因为它们类似于VB的内置Cxxx函数

您可以在我的CLR扩展项目中看到它们


这是半开玩笑的意思,因为这个问题有点傻

public static bool IsNull (this System.Object o)
{
   return (o == null);
}
这是一个扩展方法,但是它扩展了System.Object,所以您现在使用的每个对象都有一个IsNull()方法

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

if (foo.IsNull())
而不是超级瘸子:

if (foo == null)
使用Equals方法:

object value2 = null;
Console.WriteLine(object.Equals(value2,null));
公共静态T为空(此T v1,T defaultValue)
{
返回v1==null?默认值:v1;
}
isNull(新的myValue())
您可以编写两个函数

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

它们工作得非常好

我一直在对我的数据行类型使用以下扩展方法:

    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");
我首先检查列是否存在,因为如果查询结果中没有一个列的值为非空,DataTable对象甚至不会提供该列。

请使用以下方法

    /// <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;
    }
//
///如果表达式为null,则返回替换值
/// 
/// 
/// 
/// 
公共静态长?IsNull(长表达式、长替换)
{
if(表达式.HasValue)
返回表达式;
其他的
退换货;
}
/// 
///如果表达式为null,则返回替换值
/// 
/// 
/// 
/// 
公共静态字符串IsNull(字符串表达式、字符串替换)
{
if(string.IsNullOrWhiteSpace(表达式))
退换货;
其他的
返回表达式;
}
公共静态T为空(此T为默认值,T为替代值)
{
对象obj=“kk”;
if((对象)DefaultValue==DBNull.Value)
{
obj=null;
}
if(obj==null | | DefaultValue==null | | DefaultValue.ToString()==“”)
{
返回替代值;
}
其他的
{
返回默认值;
}
}
//此方法可以使用DBNull和null值。这个方法就是问题的答案

这并不能回答问题。你不知道sql server中的ISNULL是做什么的,FlySwat。也许这在C#中的工作方式不同,但我知道在VB中,当OP询问对象为null时,这不适用于测试对象。我自己也试过。我对System.Object做了这样的扩展。问题是扩展方法需要一个实际的
对象
对象来操作,如果对象什么都不是(这正是您在本Q中尝试测试的情况)扩展类没有可操作的实例,因此它将引发NullObject异常。@eidylon看起来您无法在VB中访问
对象
上的扩展方法。我知道很多地方把它称为三元运算符。此时恰好只有一个三元运算符,但这是它的一个属性,而不是它的名称。它实际上是条件运算符。如果C#获得另一个三元运算符,将会有很多令人困惑的书籍。您可以将dbnull强制转换为一个对象((object)oldValue???(object)dbnull.Value))@JeremyGray
(object)oldValue??(object)DBNull.Value)
将等同于
((object)oldValue==null)?(object)DBNull.Value:(object)oldValue
这与Robert Rossney的解决方案解决的问题不同。我尝试使用null合并运算符,但不断得到错误运算符“??”无法应用于“bool”和“int”类型的操作数。这个错误具有误导性。问题是,我试图将操作数右侧的int赋值给布尔变量。我不得不从
this.BinaryExists=vModel.BinaryExists??0;
this.BinaryExists=vModel.BinaryExists??虚假的
。看起来他们更改了CodePlex上的所有URL。试试这个:虽然这个代码片段可以解决这个问题,但它没有解释为什么或者如何回答这个问题。请,因为这确实有助于提高你的文章质量。请记住,您将在将来回答读者的问题,这些人可能不知道您的代码建议的原因。标记者/审阅者:这样,即使
MyValue
不为空且不是必需的,也将执行
new MyValue()
!!这个答案只返回True或False,这不是OP所要求的。