1024

白客
  首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

PetShop 4.0学习笔记:Nullable类型

Posted on 2006-12-22 10:57  白客  阅读(1429)  评论(0编辑  收藏  举报
Demo位置:项目Model>>类OrderInfo.cs>>private Nullable<int> authorizationNumber;

.NET2.0 Nullable类型简介

C#2.0提供了对基于泛型的并且有简洁语法支持的所有值类型的Nullable版本解决了这个长期以来一直未能解决的问题。

Nullalbe类型的变量可以代表所有的值类型和对应的空值。定义值类型为nullable类型的方法是使用泛型Ssytem.Nullable<T>.因此定义一个nullable整数的语法是:

System.Nullable<int> i;

这种方法看起来有点冗长,因此C#开发组给我们提供了一种空类型的简洁的语法形式 [值类型]?。因此System.Nullable<T>和T?是可以互换的,下面的语句是等效的并且都会声明一个nullable的整型变量。

System.Nullable<int> i;
Or
int? i;

用这种语法你可以声明任何值类型为nullable类型。你将会在下面看到更多的例子。

理解System.Nullable<T>类型

在我深入讲解nullable类型的不同特性和好处之前,理解一下.NET中nullable类型的行为是有好处的。我已经提到这种行为的核心是泛型。如果想了解更多关于泛型的信息你可以看下面一篇很好的文章:http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnvs05/html/csharp_generics.asp

ystem.Nullable<T>是一种使nullable类型充满魔力的泛型。你可以把任何类型声明成nullable。Nullble类型例子:

int? i = -1;
bool? flag = null;
char? chr = 'z';
int?[] MyArray = new int?[10];

注意,T在System.Nullable<T>中永远使值类型。因此下面的代码使不正确的,将会出现编译时的警告(你可能希望出现的是错误,但是实际上我发现只是简单给除一些警告)

string? Message = "Hello, World!";       // Compiler warning
SomeClass? someClass { };          // Compiler warning

System.Nullable<T>有两个属性:HasValue(布尔类型)和Value(这个值和nullable类型代表的值类型相同)。HasValue对于非空的实例来说总是true对于空的实例总是false。当HasValue是true,Value属性返回包含的值。当HasValue是false的时候,如果仕途取得Value属性将会导致InavalidOperationExeption异常。这和你所期望的nullable类型的行为是一致的。

使用Nullable类型

下面的代码演示了如何使用一个nullable的整型。

int? i;    // declaration
Console.WriteLine(i.HasValue);     // will print false
Console.WriteLine(i.Value);        // through InvalidOperationException
i = 18;                            //initialization
Console.WriteLine(i.HasValue);     //true
Console.WriteLine(i.Value);        //print 18

检测空类型

正如你在上面的代码中看到的那样,当你创建一个nullable类型的新实例的时候,它的HasValue属性返回false,这意味着(前面提到过),如果视图访问value属性将会导致InvalidOperationException异常。那是不是意味着我们总是需要检测HasValue属性来确定nullable类型变量是否是空呢?绝对不需要,在c#中可以用和比较引用类型一样的方法拿nullable对象和null关键字对比。因此下面的代码是合法的:

if (i == null)
Console.WriteLine("i is null");

在客户代码中,你会经常来检测对象是否为空,如果非空就使用其值,否则根据需要做出绝对。例如在下面的代码中,我定义i为nullabl的整型x为普通的整型。接下来,我检测i是否为空,如果为空,我使用i的默认值。这里顺便演示了在c#2中使用新的关键字default。如果非空,把i的值(value)赋给x。

int? i = 18;
int x;
if(i == null)
   x = default(int);
else
   x = i.Value;

代码很长,不是吗?在c#2中引进了一种新的运算符??来实现这个。看下面的代码:

int? i = 18;
int x;
x = i?? default(int); //getting default value
or
x = i ?? 18; //defining my own value

结论

         现在使用c#2.0你使用功能强大而且优雅的nullable类型以及与此相关的特殊语法来想检验引用类型一样来检验是否为空。空类型给我们提供了一种强大的机制来处理一下特殊的情况包括数据中的空值和其他一些包含可以不赋值的域的特殊类型。既然这种特性是使用泛型实现的,所以不会带来性能上的重大损失。然而,将一个普通的(值)类型转换为nullable类型是会增加一次底层的操作的。因此nullable类型要慎用。当把nullable类型赋给普通类型和互相操作的时候也会需要一些特殊的考虑。 

 原文地址:http://www.asptoday.com/Content.aspx?id=2371

截自:http://netboy.cnblogs.com/archive/2006/04/21/381795.html