C#相当于SQL Server中的IsNull()函数
在SQL Server中,可以使用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
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所要求的。