我有一点混淆以下的事情:当我们必须在C#.Net中使用DBNull.Value,null和“”时,
- 空
- DBNull.Value
- “”
当我使用条件语句或在分配值,我有点有点与这些东西混淆。有时它会抛出错误,并且有时它会起作用。我想知道我什么时候想要使用上述的东西。它们是否与数据类型有关?我需要你的宝贵建议。
我有一点混淆以下的事情:当我们必须在C#.Net中使用DBNull.Value,null和“”时,
当我使用条件语句或在分配值,我有点有点与这些东西混淆。有时它会抛出错误,并且有时它会起作用。我想知道我什么时候想要使用上述的东西。它们是否与数据类型有关?我需要你的宝贵建议。
null
是两件事情之一:
0
)Nullable<T>
结构,它目前还没有一个值(HasValue
属性也将返回false
)DBNull
是特定于ADO.NET的某些部分来代表数据库中的null
。我还没有想到一个很好的理由,他们为什么不在这里使用正规的null
。
""
是一个长度为零的字符串 - 一个完全有效但空的字符串。其意义在于null
字符串和""
字符串之间,像value.Trim()
这样的实例方法的行为将有所不同; null.Trim()
会抛出异常; "".Trim()
只是""
。一般来说,使用string.IsNullOrEmpty(value)
作为测试使这种区别消失。
null
是语言的内部,只是意味着对象引用当前不引用实际的对象。基本上,值类型(int,bool等)和引用类型(Object,任何类等)之间的关键区别在于,值类型是内存中的具体值,引用类型是指向对象表示的指针在记忆中。这个指针有时候可以指向什么也没有。在这种情况下,它是null
。它基本上意味着“这里没有C#对象存在”。
DBNull.Value
与使用数据库的目的略有不同。数据库列可以包含一个null
值。但是,在代码中将这些数据选入对象(如DataTable
)时,是的一个对象,只要涉及代码即可。但是,该对象包含来自数据库的null
值的表示。因此,存在DBNull.Value
来表示该区别。它基本上意味着“这里有一个C#对象,它从数据库中获取了一个值,但该值为null
。”
“”(或string.Empty
如果您想使用内置常量)是一个有效值。它存在,它不是null
,它在各方面都是string
。它只是没有任何字符。一个有用的工具来检查这是string.IsNullOrEmpty()
其中检查null
或空字符串。
“所以你不必在内存中实例化一个新的字符串来保存任何东西” - 实习会使得这非常不切实际。我不会强调''“''和'string.Empty'之间的差别。 –
@Marc Gravell:没错,在这一点上它已经非常好的优化了。我想,老宠物尿尿很难死。 – David
null适用于C#空值。
System.DBNull.value适用于数据库特定的NULL值。
当您使用ExecuteScalar()时,如果列未找到或返回,则返回null,但找到列并且值为null,则返回DBnull,如果值为null,则返回DBnull,否则返回DBnull。
+1:我对DBNull的原因没有任何第一手知识,但我发现它有助于区分内存中的空对象(这对我来说是不好的)和适当的空值数据库(我需要)。我相信他们可以将它构建为对两者都使用null,但我发现这种区别很有用。 –
@Joel够公平的;可悲的是,我从来没有过。这只是一件要记住的事情......'param.Value = value ?? DBNull.Value;'等 –
@MarcGravell当它有用时,是在SqlCommand.ExecuteScalar的返回值中。当结果集有零行时返回null。至少有一行时返回DBNull.Value,但第一列的数据库为NULL。 –