.NET DBNull与所有变量类型的Nothing?

.NET DBNull与所有变量类型的Nothing?,.net,vb.net,variables,dbnull,null,.net,Vb.net,Variables,Dbnull,Null,我对.NET中的空值和变量有点困惑。(VB优先) 有没有办法检查任何给定变量的“空值”,而不管它是对象还是值类型?或者我的空检查必须总是预测它是检查值类型(例如System.Integer)还是对象 我想我要找的是一个检查所有可能的空值的函数。也就是说,任何类型的变量 a) 自声明后从未分配过值 b) 从数据对象(来自数据库)分配了空值 c) 设置为等于另一个为空的变量值 d) 已设置为从未设置或过期的ASP.NET会话/应用程序变量 在.NET中处理空场景时,是否有一个通用的最佳实践 更新:当

我对.NET中的空值和变量有点困惑。(VB优先)

有没有办法检查任何给定变量的“空值”,而不管它是对象还是值类型?或者我的空检查必须总是预测它是检查值类型(例如System.Integer)还是对象

我想我要找的是一个检查所有可能的空值的函数。也就是说,任何类型的变量

a) 自声明后从未分配过值

b) 从数据对象(来自数据库)分配了空值

c) 设置为等于另一个为空的变量值

d) 已设置为从未设置或过期的ASP.NET会话/应用程序变量

在.NET中处理空场景时,是否有一个通用的最佳实践


更新:当我谈到值类型为“null”时,我真正的意思是一个值类型,它要么从未被设置,要么在某个点上被设置为等于或从null对象转换而来

值类型不能为null。它违反了作为值类型的含义。您可以将值类型包装为可为null(Of T),这为您提供了一组非常好的方法,并且可以检查是否没有任何结果。但你确实有很多开销与包装。也许你可以澄清你想做什么

为完整起见,可空包装器的VB语法为:

Dim i as Nullable(Of Integer) = Nothing '.NET 2.0/3.0'
Dim j as Integer? = Nothing '.NET 3.5'

编辑:值类型总是预先初始化为默认值,0表示数字,false表示布尔值,等等。

值类型变量不能包含null,这是因为null意味着,null意味着引用不指向任何地方。我不知道在VB.net上,但在c#上,可以使用“?”将值类型包装为可为空的,如:


这就是你想要的吗

if IsNothing(foo) OrElse IsDbNull(foo) Then
    ' Do Something Because foo Is Either Nothing or DBNull.Value
End If
事实上,我不知道你为什么想要这种结构。唯一一次检查DBNULL.Value是在我使用来自数据库的值时,在我将所述值从数据名称空间类分配给其他类之前[即dim b as string=dataReader(0)]


通常,如果您担心一个对象没有被实例化,或者需要重新实例化,那么只需进行IsNothing检查就足够了。

在.Net中,我只知道null(在VB中为nothing)和DbNull这两种类型的null。如果您使用的是System.Nullable,则可以使用与对象相同的null检查语法。如果您的可空对象已装箱,.Net 2.0 CLR足够聪明,可以找到正确的方法来处理此问题

我遇到这两种类型的唯一情况是在应用程序的数据层中,我可能直接访问数据库数据。例如,我在DataTable中遇到了DbNull。要在这种情况下检查这两种空类型,您可以编写一个扩展方法,如(对不起,在C#中):


只要你开发的是严格的选项,(a)就不应该成为问题。编译器会对你大喊大叫。如果您担心检查参数,只需使用

Public Sub MySub(ByVal param1 as MyObject, ByVal param2 as Integer)
    if param1 is nothing then
         Throw New ArgumentException("param1 cannot be null!")
    end if
    'param2 cannot be null
End Sub
对于(b),数据库交互层应该处理这个问题。如果您使用的是LINQ,那么有一些方法可以处理这个问题。如果您使用的是类型化数据集,则自动生成的行上有一个.IsMyVariableNull属性

对于(c),您不需要担心值类型,但是可以使用简单的IsNothing(或IsNotNothing)检查引用类型

对于(d),可以在读取后应用相同的逻辑。对接收变量进行测试

在大多数情况下,一个简单的检查是什么都不会让你通过。您的数据库交互层将帮助您处理数据中更为棘手的空值情况,但如何正确处理它们取决于您。

正常值类型(布尔值、整数、长值、浮点值、双精度值、枚举和结构)不可为空

所有值类型的默认值均为0

CLR不允许您访问变量,除非它们已设置。您可能认为情况并非总是如此,但有时CLR会介入并为您初始化它们。在方法级别,必须在使用所有变量之前显式初始化它们

此外,正如其他人指出的,自.NET2.0以来,有一种新的泛型类型称为
Nullable
。C语言中有一些编译器速记,比如int?表示可为空,双精度?表示
可为空

您只能将
Nullable
包装在不可为null的值类型上,这很好,因为引用已经能够为null

int? x = null;
对于int?,虽然可以针对null进行测试,但有时调用
x.HasValue()
会更好

在C#中也有??当您要将可为null的值分配给不可为null的值类型时。但是如果没有运算符,可以调用GetValueOrDefault()


智力?只是C#编译器对Nullable的缩写。规则是,对于所有值类型,默认值为0。(int、long、float、double、枚举、结构等)
Public Sub MySub(ByVal param1 as MyObject, ByVal param2 as Integer)
    if param1 is nothing then
         Throw New ArgumentException("param1 cannot be null!")
    end if
    'param2 cannot be null
End Sub
int? x = null;
int y = x ?? 2; // y becomes 2 if x is null.
int z = x.GetValueOrDefault(2); // same as y