正在阅读:掌握 ASP.NET 之路:自定义实体类简介掌握 ASP.NET 之路:自定义实体类简介

2005-06-23 10:16 出处: 作者:Karl Seguin 责任编辑:moningfeng

参考资料

• Mapper 设计模式

• Data Mapper 设计模式

• Wilson ORMapper

• Frans Bouma 关于 O/R 映射的帖子

• LLBGenPro

• NHibernate


.NET Framework 2.0 的功能

即将面世的 .NET Framework 2.0 版将改变我们在本指南中讨论的一些实施细节。这些改变将减少支持自定义实体所需的代码数量,并有助于处理映射问题。

泛型

议论颇多的泛型之所以存在,主要原因之一就是为了向开发人员提供现成的强类型的集合。我们避开 Arraylist 等现有集合是因为它们属于弱类型。泛型提供了与当前集合同样的方便性,而且它们属于强类型。这是通过在声明时指定类型来实现的。例如,我们可以替换 UserCollection 而不需要增加代码,然后只需创建一个 List 泛型的新实例并指定我们的 User 类即可:

'Visual Basic .NET
Dim users as new IList(of User)

//C#
IList users = new IList();



声明后,我们的 user 集合就只能处理 User 类型的对象了,这为我们提供了编译时检查和优化的所有优点。

参考资料

• Introducing .NET Generics

• An Introduction to C# Generics


可以为空的类型

可以为空的类型实际上就是由于其他原因而非上述原因而使用的泛型。处理数据库时面临的挑战之一就是正确一致地处理支持 NULL 的列。在处理字符串和其他类(称为引用类型)时,您只需为代码中的某个变量指定 nothing/null:

'Visual Basic .NET
if dr("UserName") Is DBNull.Value Then
user.UserName = nothing
End If

//C#
if (dr["UserName"] == DBNull.Value){
user.UserName = null;
}



也可以什么都不做(默认情况下,引用类型为 nothing/null)。这对值类型(例如整数、布尔值、小数等)并不完全一样。您当然也可以为这些值指定 nothing/null,但这样将会指定一个默认值。如果您只声明整数,或者为其指定 nothing/null,变量的值实际上将为 0。这使其很难映射回数据库:值究竟为 0 还是 null?可以为空的类型允许值类型具有具体的值或者为空,从而解决了这个问题。例如,如果我们要在 userId 列中支持 null 值(并不是很符合实际情况),我们会首先将 userId 字段和对应的属性声明为可以为空的类型:

'Visual Basic .NET
Private _userId As Nullable(Of Integer)
Public Property UserId() As Nullable(Of Integer)
Get
Return _userId
End Get
Set(ByVal value As Nullable(Of Integer))
_userId = value
End Set
End Property


//C#
private Nullable userId;
public Nullable UserId {
get { return userId; }
set { userId = value; }
}



然后利用 HasValue 属性判断是否指定了 nothing/null:

'Visual Basic .NET
If UserId.HasValue Then
Return UserId.Value
Else
Return DBNull.Value
End If

//C#
if (UserId.HasValue) {
return UserId.Value;
} else {
return DBNull.Value;
}



参考资料

• Nullable types in C#

• Nullable types in VB.NET

键盘也能翻页,试试“← →”键

关注我们

最新资讯离线随时看 聊天吐槽赢奖品