分享

可空类型

 悟静 2012-02-16

可空类型

可空类型允许变量包含未定义的值。在使用数据库和其他可能包含未含有具体值的元素的数据结构时,可以使用可空类型。对于我们使用数据库作为后端的应用程序来说,这一点尤其有用。举个例子,对于人员信息来说,姓名可能是必不可少的,而其他信息比如年龄、性别等用户可以不填,也就是说在数据库中可以为空。

从前在我们为人员信息生成了一个类型化的数据集之后,要从中读取一个可以为空的信息时,我们必须首先判断它是否为空,例如:

if(PersonInfoRow.IsAgeNull()==false)
{
Label1.Text=personInfoRow.Age;
}

而要将该字段设为空,也必须调用专用的方法,如:

if(Text1.Text.Trim()==string.Empty)
{
personInfoRow.Age=Text1.Text;
}

这种限制使得我们在开发过程中要相当小心,并且需要使用相当多的或许是不必要的代码来防止错误发生。在引入了可空类型之后,我们的开发就变得轻松多了。所要做的只是在类型声明后面加上一个?号:
int?number;
之后,便可以放心地将空值赋给它了:
number=null;

如果探究可空类型的原理,我们就会发现它其实是泛型的杰作。可空类型是System .Nullable结构的实例。可空类型可以表示其基础值类型正常范围内的值,再加上一个null值。例如,Nullable,读作"可空的Int32",可以被赋值为-2 147 483 648到2 147 483 647之间的任意值,也可以被赋值为null值。Nullable可以被赋值为true、false或null。过去,在需要使用三态数据的时候(三态数据在数据库里用得非常频繁,例如一个网站用户可以公开是男是女,也可以对自己的性别保密),我们常常需要自己定义一个枚举,现在使用Nullable就可以了。

在不想使用泛型的写法来写的时候,我们就可以用数据类型加上问号这种等效写法来写,如Nullable等效于Int32?或int?,Nullable等效于bool?,等等。

在使用的时候要注意如下几点:

(1)因为可空类型可能为空,于是很多运算法则将不再简单适用,比如A+B,如果A或者B当中有一个或者两个为可空类型,那么它们便不能简单相加,因为它们可能会为空,这时结果也就可能会为空,所以一定要先使用HasValue属性测试是否为空,或者使用GetValueOrDefault属性返回该基础类型所赋的值或默认值,再或者使用??运算符分配默认值,当前值为空的可空类型被赋值给非空类型时将应用该默认值,比如int?x=null;int y=x??-1;,但是切不可直接进行运算。

(2)可空类型可以强制转换为对应的基础类型,比如int?x=3;int y=(int)x;,但在转换之前一定要先测试是否不为空,如果为空的话就会出错。

(3)由于以上两点原因,建议不要随意使用可空类型,只在必要的时候才使用,使用时一定要小心谨慎,随时记得判断是否为空。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多