由于之前重构拖的战线比较长,做到后来就没兴致了。 以至于一些新知识没有进行尝试,隔了一段时间感觉不是那么恶心了。又拿出了泛型这个知识点研究了一下。下面, 我就跟大家聊聊, 这个泛型是个什么鬼?
泛型是程序设计语言的一种特性。允许程序员在强类型程序设计语言中编写代码时定义一些可变部分,那些部分在使用前必须作出指明。各种程序设计语言和其编译器、运行环境对泛型的支持均不一样。将类型参数化以达到代码复用提高软件开发工作效率的一种数据类型。泛型类是引用类型,是堆对象,主要是引入了类型参数这个概念。
---引自百度百科
我的理解:目前来看,我可以把泛型理解为某一确定类型对象的集合。
然后是我找的关于泛型类型的例子:
(1)泛型的基本用法
[vb] view plain copy
1. Dim data As New Generic.Dictionary(Of Integer, String)
2.
3. data.Add(3, "OK")
4. data.Add(4, "dz")
5. data.Add(1, "John")
6.
7. 'KeyValuePair(Of Integer, String) 键值对元素
8. For Each o As KeyValuePair(Of Integer, String) In data
9. TextBox1.AppendText(o.Key & "," & o.Value & vbCrLf)
10. Next
11. '==========================
12. Dim data2 As New Generic.Dictionary(Of Guid, Date)
13.
14. data2.Add(New Guid, Now)
15. For Each o As KeyValuePair(Of Guid, Date) In data2
16. TextBox1.AppendText(o.Key.ToString & "," & o.Value) 'Guid须转String
17. Next
Generic.Dictionary(Of K,T)泛型,与List(Of T)类型类似,但需两个类型参数来提供键与值(Key,Value)。
新的Dictionary类型只接受特定类型的键与值,如上面第一个是Integer与String。第二个只接收Guid与Date。
上面是声明时的情况,下面是作返回值的情况
[vb] view plain copy
1. Private Function reGeneric() As Generic.Dictionary(Of Integer, String) '返回值类型
2. Dim data As New Generic.Dictionary(Of Integer, String)
3. data.Add(3, "dx")
4. data.Add(2, "qxj")
5. data.Add(1, "ase")
6. Return data '返回泛型
7. End Function
可以这样调用上面函数:
[vb] view plain copy
1. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
2. Dim data As New Generic.Dictionary(Of Integer, String)
3.
4. data = reGeneric() '调用,取得泛型
5. For Each o As KeyValuePair(Of Integer, String) In data
6. TextBox1.AppendText(o.Key & "," & o.Value & vbCrLf)
7. Next
8. End Sub
泛型还可以作为传参:
[vb] view plain copy
1. Private Sub useGeneric(ByVal k As Generic.Dictionary(Of Integer, String)) '泛型作参数
2. 'add code
3. End Sub
(2)继承
定义新类时,可以继承泛型类型。
例如:.net BCL定义的System.ComponentModel.BindingList(Of T)泛型类型,它用于创建支持数据绑定的集合。
可以将其作用基类,创建支持数据绑定的强类型集合。
[vb] view plain copy
1. Public Class Form1
2. Dim list As New CustomerList
3.
4. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles Me.Load
5. DataGridView1.DataSource = list
6. End Sub
7. End Class
8.
9. Public Class Customer
10. Public Property Name() As String
11. End Class
12.
13. Public Class CustomerList
14. Inherits System.ComponentModel.BindingList(Of Customer) '必须指明具体的类型(如Customer)
15.
16. Private Sub CustomerList_AddingNew(ByVal sender As Object, ByVal e As System.ComponentModel.AddingNewEventArgs) Handles Me.AddingNew
17. Dim cust As New Customer
18. cust.Name = "
19. e.NewObject = cust
20. End Sub
21. End Class
上面继承时,必须指明具体类型,于是可以用BindingList(Of Customer)
常规继承概念也可以用在其中,比如:重载、重写、事件等。
1.为了介绍为什么用泛型首先要引入装箱的概念:
值类型存储在栈上,引用类型存储在堆上。
当值类型向引用类型转变,即从栈向堆上转移,这时值就变成了一对象,就好像值类型外面包装了一层东西,这个过程叫装箱(Boxing)
2.装箱的影响:
显然装箱会使“值”的外层多了一些“无用”的东西,会使得性能稍有下降。
集合中元素都来自Object(引用类型),即,它是在堆上,都涉及到一个装箱,如果数据量大时,性能下降得就可观了。
当需要时其中的“值”时,又需要把箱子,从堆上转移到栈上,即引用类型变成值类型,这个过程叫拆箱。
3.为什么要用泛型
因为集合中任何引用或值类型都将隐式的向上强制转换为Object类型 。 但是通过泛型规定, 就会消除系统的隐式转化。
'**************************************************************
'文件名:ConvertToList
'命名空间:DAL
'内容:
'功能: 对datatable 进行转换,变为泛型
'文件关系:
'作者:宋荣凯
'小组:
'生成日期:2016/5/15 15:55:10
'版本号:v1.0.0.0
'修改日志:
'版权说明:
'**************************************************************
Imports System.Reflection
Imports System.Collections.Generic
Public Class ConvertToList
Public Shared Function DateTOList(Of T As {New})(ByVal dt As DataTable) As IList(Of T)
Dim myList As New List(Of T)
Dim myType As Type = GetType(T)
Dim dr As DataRow
Dim tempName As String = String.Empty
For Each dr In dt.Rows
Dim myT As New T
Dim propertys() As PropertyInfo = myT.GetType().GetProperties() '获得属性类型
Dim pr As PropertyInfo
For Each pr In propertys
tempName = pr.Name '在一个临时string中存放属性名称
If (dt.Columns.Contains(tempName)) Then
If (pr.CanWrite = False) Then
Continue For
End If
Dim value As Object = dr(tempName) '因为这句代码 ,所以属性名称得和数据库中的名称一样。
If (value.ToString <> DBNull.Value.ToString) Then
pr.SetValue(myT, value, Nothing)
End If
End If
Next
myList.Add(myT)
Next
Return myList
End Function
End Class
Public Function SelectSettings(entity As entity.ChargeSettings) As List(Of entity.ChargeSettings) Implements IDAL.IChargeSettingsDAL.SelectSettings
Dim sql As String
Dim table As DataTable
sql = "select * from ChargeSettings"
table = sqlhelper.ExecSelect(sql, CommandType.Text)
Dim mylist As List(Of entity.ChargeSettings)
If table.Rows.Count > 0 Then
mylist = ConvertToList.DateTOList(Of entity.ChargeSettings)(table) ' table 这个括号里是参数 , 前边那个是对list中对象的定义。
Return mylist
Else
Return Nothing
End If
End Function
If IsNothing(mylist) = False Then
entity.ChargeUnit = mylist.Item(0).ChargeUnit
entity.LeastTime = mylist.Item(0).LeastTime
entity.MinuteCharge = mylist.Item(0).MinuteCharge
entity.PrepareTime = mylist.Item(0).PrepareTime
entity.SetDate = mylist.Item(0).SetDate
entity.SetPerson = mylist.Item(0).SetPerson
【总结】
泛型通过其独有的严谨性,减少了不断拆箱装箱造成的效率低下。