2008-10-02 24 views
6

我对.NET中的空值和变量有点困惑。 (VB首选).NET DBNull vs没有跨所有变量类型?

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

我想我正在寻找的是一个函数,它检查所有可能的无效类型。也就是说,

一)从来没有因为宣布

b赋值的任何类型的变量)被分配从数据对象(即从数据库中传来)

下的空值)进行设置等于另一个变量值为空

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

在.NET中处理空场景是否有一个通用的最佳做法?

UPDATE:当我谈到一个值类型为“null”时,我真正的意思是一个值类型,它从未设置或者在某个点设置为等于或从空对象转换。

回答

2

正常值类型(布尔值,整数,longs,float,double,enum和structs)不可为空。

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

的CLR,除非他们已经确定不会让你访问的变量。您可能认为情况并非总是如此,但有时CLR会为您进行初始化。在方法级别,您必须在使用它们之前明确地初始化所有变量。

另外,正如其他人指出的那样,由于.net 2.0有一个新的通用类型,称为Nullable<T>。在C#中有一些编译器简写如int?意味着Nullable<int>,双重?意味着Nullable<double>

你只能包装Nullable<T>不可以为空的值类型,这是很好的,因为引用已经有能力为null。

int? x = null; 

对于int?而你可以测试是否为NULL,它有时更好打电话x.HasValue()

在C#中还有nullable coalescing operator ??当你想把一个可为空的值赋给一个不可为空的值类型时。但是如果你没有运营商,你可以调用GetValueOrDefault()。

int y = x ?? 2; // y becomes 2 if x is null. 
int z = x.GetValueOrDefault(2); // same as y 
4

值类型不能为空。它违反了它意味着什么是价值类型。你可以将值类型封装为Nullable(Of T),它可以给你一套很好的方法,并检查Nothing做什么。但是你用这个包装器有很多开销。也许你可以澄清你想要做什么?

为了完整性对于可为空的包装的VB语法是:

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

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

+0

规则是对于所有值类型,默认值为0.(int,long,float,double,enums,structs等) – 2008-10-02 23:45:22

0

值类型变量不能包含空值,这是因为null意味着null,意味着引用无处指向。我不知道在VB.net,但在C#中你可以用值类型是使用,喜欢nullables“?”:

int? a = null; 
+0

int?只是Nullable的一个C#编译器速记。 – 2008-10-02 23:41:41

2

这是你以后?

if IsNothing(foo) OrElse IsDbNull(foo) Then 
    ' Do Something Because foo Is Either Nothing or DBNull.Value 
End If 

事实上,我不确定你为什么希望这个结构。我唯一要检查DBNULL.Value的时候是当我使用来自数据库的值时,以及在我将一个DATA命名空间类中的值赋给其他类之前[即dim b as string = dataReader(0)]。

通常,如果您担心某个对象没有被实例化,或者需要重新实例化,那么只需一个IsNothing检查即可。

1

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

我遇到这两种类型的唯一情况是在我可能直接访问数据库数据的应用程序的数据层中。例如,我在DataTable中遇到了DbNull。当您与选项严格对开发只要

static public bool IsNull(this object obj) 
{ 
    return obj != null && obj != DbNull.Value; 
} 

... 

if(dataTable[0]["MyColumn"].IsNull()) 
{ 
    //do something 
} 
0

,(一)不应该”:要检查这两个空类型在这个situration的,你可以写一个扩展方法一样(对不起,C#)不成问题。编译器会对你大喊。如果您担心检查参数,只需使用

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),您不需要担心值类型,但可以使用简单的Is Nothing(或IsNot Nothing)来检查引用类型。 (d),您可以在读取后应用相同的逻辑。根据Nothing测试接收变量。

绝大多数情况下,Is Nothing的简单检查将会帮助您。您的数据库交互层将帮助您处理数据中空值较粘的情况,但这取决于您是否适当地处理它们。

相关问题