在Visual Baisc.NET 2005中使用泛型

      泛型(Generics)是Visual Basic 2005中的一种新特性,泛型可以使你在编程过程中体会到更多的快乐。你不需要额外的工作就能体会到代码重用(reuse)的优点。

一、泛型的优点
使用泛型可以提高性能,其中显著的一个改进是.NET框架组件不会在值类型上使用装箱(boxing);使用泛型类的另一个令人惊讶的特性是IntelliSense居然可以跟踪强数据类型定义。

 

 

这个类的声明看起来很常见,但是请留意“(Of ItemType)”条目。这个条目就是泛型类与标准类的差别。你可以把它看作是一个占位符,在未来实例化这个类的时候,你需要提供类型。当.NET框架组件发现这个条目的时候,它用使用这个类的代码所提供的类型来替换这个条目。当然,你没有必要在类中使用ItemType(数据项类型)——你可以把泛型类随便叫什么名字,就像为变量命名一样。

二、建立泛型类

使用泛型的时候,你应该选择有广泛用途的类,这样的话建立泛型类所需要的时间最终会在减少开发时间方面给予你回报。例如,集合就是一种处理多个数据类型的类,并且一般你会在多个应用程序中使用同一个集合的多种不同的形式。你不需要每次根据草稿建立集合,而是使用泛型建立一个泛型类原型(prototype)。首先,你需要给代码添加如下所示的Imports语句:Imports System.Collections.Generic

添加Imports语句之后,你就可以建立泛型类了。基本的类看起来很常见。你可以使用属性、函数、子程序、字段或可以在类中使用的其它任何东西,如列表1所示:

Public Class MyGenericCollection(Of ItemType) ' 定义一个通用的集合 Private Items As Collection(Of ItemType) ' 建立构造函数 Public Sub New() Items = New Collection(Of ItemType) End Sub ' 返回集合中数据项的数量 Public ReadOnly Property Count() As Integer Get Return Items.Count End Get End Property ' 得到或设置一个特定的数据项 Default Public Property Item(ByVal Index As Integer) As ItemType Get Return Items(Index) End Get Set(ByVal value As ItemType) Items(Index) = value End Set End Property ' 给集合添加新的数据项 Public Sub Add(ByVal Value As ItemType) Items.Add(Value) End Sub ' 从集合中删除数据项 Public Sub RemoveAt(ByVal Item As Int32) Items.RemoveAt(Item) End Sub End Class


三、使用泛型类
我们在上面建立的泛型类在使用方法上与其他类没有什么不同,仍然需要将其实例化。

Private Sub btnTest_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) _ Handles btnTest.Click ' 建立新集合 Dim CollectInt As New MyGenericCollection(Of String) ' 在集合上执行某些事务 CollectInt.Add("One") CollectInt.Add("Two") CollectInt.Add("Three") CollectInt.RemoveAt(1) ' 显示一些统计信息 MessageBox.Show("Number of Entries: " + CollectInt.Count.ToString()) MessageBox.Show("Value of First Item: " + CollectInt(0)) End Sub

        
四、约束泛型类
也许你对实例中泛型类能够接受任何数据类型感恐惧,你不得不担心在使用中出现程序仍然会对错误参数产生反映,对,是存在这样的风险,不过我们可以对泛型类加以约束。

你可以通过修改声明来约束泛型类,使它只能接受Address数据类型。例如,你可能希望改变列表1中的集合,如下所示:

Public Class MyGenericCollection(Of ItemType As Address)

这个泛型类现在只能接受Address数据类型。任何其它的用法都会产生错误(IDE拒绝编译代码)。你可以把任何通用类型(包括接口)作为约束。例如,你可能希望定义一个泛型类,它只能接受实现IcustomFormatter接口的数据类型。


五、为泛型类定义多个类型
你不必仅仅使用一种数据类型定义每个类,泛型类也提供多个数据类型,你所需要做的是用逗号分开每种数据类型。

你不必仅仅使用一种数据类型定义每个类。幸运的是,泛型类也提供多个数据类型。你所需要做的是用逗号分开每种数据类型,如下所示:

Public Class MyGenericCollection(Of ItemType1, ItemType2, ItemType3)

这个声明接受三个输入的数据类型(不能多,也不能少)。在例子中,代码在数据类型上没有做任何约束,但是你可以轻易地根据需要添加约束。实际上,你可以在同一个声明中带有和不带约束、混合和匹配数据类型,带有约束的数据类型不必拥有相同的约束类型。你可以包含一个使用特定类和另一个依赖于某种接口的数据类型。


结束语
尽管泛型类起先看起来仅仅是前进的一步,但是它们实际上是.NET革命中的一个巨大飞跃。使用泛型把你从为每个数据类型建立新类中释放了出来,提高了性能,并减少了开发和调试的时间。为了体会Visual Studio 2005中最好的部分,你真的应该试着使用这个新特性——你会发现自己将很喜欢它的。

 

看看通过反射机制来初始化实例的例子:

Imports System.Reflection Public Class Form1 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim o As Object = Activator.CreateInstance(Type.GetType("A.a")) '工程名称.类名 Dim MyProperty As PropertyInfo = o.GetType().GetProperty("NAME") Dim objValue As Object = "Bbb" MyProperty.SetValue(o, objValue, Nothing) Dim objReturn() As Object MsgBox(MyProperty.GetValue(o, objReturn).ToString()) End Sub End Class Public Class a private _name As String Public _id As Integer Public Property NAME() As String Get Return _name End Get Set(ByVal value As String) _name = value End Set End Property End Class

你可能感兴趣的:(在Visual Baisc.NET 2005中使用泛型)