【机房收费系统】泛型是个什么鬼?


【前言】

       由于之前重构拖的战线比较长,做到后来就没兴致了。 以至于一些新知识没有进行尝试,隔了一段时间感觉不是那么恶心了。又拿出了泛型这个知识点研究了一下。下面, 我就跟大家聊聊, 这个泛型是个什么鬼?

【正文】

一、什么是泛型?

       泛型是程序设计语言的一种特性。允许程序员在强类型程序设计语言中编写代码时定义一些可变部分,那些部分在使用前必须作出指明。各种程序设计语言和其编译器、运行环境对泛型的支持均不一样。将类型参数化以达到代码复用提高软件开发工作效率的一种数据类型。泛型类是引用类型,是堆对象,主要是引入了类型参数这个概念。

---引自百度百科

我的理解:目前来看,我可以把泛型理解为某一确定类型对象的集合。

 

然后是我找的关于泛型类型的例子:

 

     1)泛型的基本用法

[vb] view plain copy  

1. Dim data As New Generic.Dictionary(Of IntegerString)  

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 IntegerStringIn 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, DateIn data2  

16.     TextBox1.AppendText(o.Key.ToString & "," & o.Value) 'Guid须转String  

17. Next  

        Generic.Dictionary(Of KT)泛型,与ListOf  T)类型类似,但需两个类型参数来提供键与值(KeyValue)。

        新的Dictionary类型只接受特定类型的键与值,如上面第一个是IntegerString。第二个只接收GuidDate

 

       上面是声明时的情况,下面是作返回值的情况

[vb] view plain copy  

1. Private Function reGeneric() As Generic.Dictionary(Of IntegerString'返回值类型  

2.     Dim data As New Generic.Dictionary(Of IntegerString)  

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 IntegerString)  

3.   

4.     data = reGeneric() '调用,取得泛型  

5.     For Each o As KeyValuePair(Of IntegerStringIn 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 IntegerString)) '泛型作参数  

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 ObjectByVal 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类型 。 但是通过泛型规定, 就会消除系统的隐式转化。

三、泛型在机房怎么用?(在回传一个datatable 转换的泛型)

1.首先要和实体属性类型和数据库数据类型和名称都要完全一致

2. ConverttoList类:

'**************************************************************
'文件名: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


3.在d层中的代码

    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

4.u 层效果

   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



【总结】

泛型通过其独有的严谨性,减少了不断拆箱装箱造成的效率低下。 

你可能感兴趣的:(【机房收费系统】)