嗔秤戻幣�哉膵�云利匈嬉蝕湊蛸賜�塋床四衲���萩晦編報炎嘔囚^泡仟 ̄云利匈�《超噌�殻窟�嵌虜隆輓麈觚翹瀘卉韮�仍仍�。� 烏御危列
浪慕利 卦指云慕朕村 厘議慕尺 厘議慕禰 TXT畠云和墮 序秘慕杏 紗秘慕禰

VB2008貫秘壇欺娼宥(PDF鯉塀哂猟井)-及102嫗

梓囚徒貧圭�鮗� ○ 賜 ★ 辛酔堀貧和鍬匈��梓囚徒貧議 Enter 囚辛指欺云慕朕村匈��梓囚徒貧圭�鮗� ● 辛指欺云匈競何��
!!!!隆堋響頼��紗秘慕禰厮宴和肝写偬堋響��






     Reading the sentence�察�you get an idea of what is being said�察�but you are not pletely  

sure。 Visual Basic without  generics is like this sentence�察�in that you express your ideas in  

code�察�but some things are not as clear as you would like。 

     Visual Basic with  generics is like this sentence�此�



     Ducks walk in a funny manner due to their flat feet�察�and when they quack�察�it is very 

     loud。 



     The sentence is clearer and uses more words to describe the same thing。 The reason we  

talk using a more sophisticated language is that we want to explain concepts and be under

stood。 If you accept that�察�then you can accept why there is a need and context for  generics。  

And if not�察�feel free to skip this chapter and read the next one。  

     An example that illustrates how using  generics makes your code clearer�察�as well as  

more concise�察�than code that does not use  generics is a container。 A  container is a type  

that is used to manage other types�察�lists and collections are examples of containers。 To keep  



                                                                                                          285 


´´´´´´´´´´´´´´´´´´´´´´Page 308´´´´´´´´´´´´´´´´´´´´´´´

286       CH AP T E R   1 1   *    L E A R N I N G   A B OU T   。 N E T  G E N E R I CS 



          things simple�察�let¨s look at a container that manages a single reference。 The following is the less  

           concise version that uses the Object type。 



           Public Class Container  

              Private _managed As Object 



              Public Sub New��ByVal toManage As Object�� 

                  _managed = toManage 

              End Sub 



              Public ReadOnly Property Managed�┌� As Object 

                  Get 

                      Return _managed 

                  End Get 

              End Property 



           End Class 



                In the code�察�the class Container has a constructor with a parameter and a single property�察 �

          Managed�察�which references the variable _managed。 The idea behind this class is to assign an  

           object in the constructor that can be referenced using the property。 The class Container does  

          not know what the variable _managed does or its capabilities。 Container does not care�察�because  

           Container is acting like a basket that holds an instance of whatever is given to it。 

                The Container class could be used as follows�此�



           Dim container As Container = New Container��New MyType�┌��� 



          TryCast��container。Managed�察�MyType��。Method�┌� 



                When Container is instantiated�察�the _managed data member is assigned an instance of  

          MyType。 MyType is a type that is used for illustrative purposes and has a single method�察�Method�┌�。  

          To retrieve and use the managed type�察�the property Managed is referenced。 However�察�the  

           method Method�┌� cannot be called directly because the property Managed is of type Object�察�and  

          thus you need to cast the property to type MyType so that the call to Method�┌� is legal。 

                The cast using TryCast will result in a valid instance of MyType or a Nothing value�察�resulting  

           in a null object reference exception。 Here¨s a safe way of using the Managed property�此�



           Dim container As Container = New Container��New MyType�┌��� 



           If TypeOf container。Managed Is MyType Then 

              TryCast��container。Managed�察�MyType��。Method�┌� 

           End If 



                The bolded code is the addition of the If block to test whether the container references the  

          type MyType。 Not shown is what the code should do if the property Managed is not MyType。 The  

          fact that you need to verify that the container references the correct type�察�and you also need to  

          think of an alternative plan if the type is incorrect�察�adds quite a bit of code。 It¨s like that sentence  

           about the duck!sure�察�you get the general idea of what is being said�察�but are you 100�ァ�sure of  

          the meaning�拭�


´´´´´´´´´´´´´´´´´´´´´´Page 309´´´´´´´´´´´´´´´´´´´´´´´

                                                       CH AP T E R   1 1   *    L E A R N IN G   AB O U T   。 N E T  G E N E R I CS 287 



     Now look at the following code�察�which implements a container using  generics。 



    Public Class GenericsContainer��Of ManagedType�� 

        Private _managed As ManagedType 



        Public Sub New��ByVal toManage As ManagedType�� 

            _managed = toManage 

        End Sub 



        Public ReadOnly Property Managed�┌� As ManagedType 

            Get 

                Return _managed 

            End Get 

        End Property 

    End Class 



     You can write code that uses  generics and code that provides types based on   

generics。 The definition of GenericsContainer demonstrates code that provides types based on  

 generics。 You¨ll see the code that uses  generics next。  

      generics parameters are associated with types�察�such as classes and interfaces�察�or with  

methods。 In the case of GenericsContainer�察�the  generics parameter ManagedType is a  

placeholder for an actual type。 



*Note  monly�察�developers use the notation of a single letter when defining a  generics parameter。  

I am not a fan of that notation�察�because it tells me nothing�察�especially when there are multiple parameters。 I  

remend using an identifier that describes what the parameter does�察�appended with the word Type�察�to  

indicate a  generics parameter is being defined。 



     With GenericsContainer�察�ManagedType is used as an identifier in the place of the identifier  

object in the type Container。 This is a rule of thumb。 Whenever you find yourself using an object  

generically to define a type�察�you probably could use  generics。 Think of  generics  

types as general things。 

     The following code demonstrates how to use GenericsContainer with MyType。 



Dim container As GenericsContainer��Of MyType�� = _ 

    New GenericsContainer��Of MyType����New MyType�┌��� 

container。Managed。Method�┌� 



     When instantiating GenericsContainer�察�notice how the identifier ManagedType must be  

replaced with an identifier that represents an already existing type。 This identifier replacement  

results in a new and unique type ��also called a concrete type��。 The advantage of  generics is  

that when you provide a concrete type�察�you don¨t need to check to make sure that everything is  

correct。 

     The  runtime will generate a type that has an intent similar to the following code。 


´´´´´´´´´´´´´´´´´´´´´´Page 310´´´´´´´´´´´´´´´´´´´´´´´

288        CH AP T E R   1 1   *    L E A R N I N G   A B OU T   。 N E T  G E N E R I CS 



           Public Class GenericsContainerMyType  

               Dim _managed As MyType 



               Public Sub New��ByVal toManage As MyType��  

                   _managed = toManage 

               End Sub 



               Public ReadOnly Property Managed�┌� As MyType  

                   Get  

                       Return _managed 

                   End Get 

               End Property 

           End Class 



                Visual Basic piles a  generics type as an inplete type。 When the inplete  

           type is concretized�察 �creates a brand´new type�察�and does this without requiring the devel

           oper to do anything in particular。 This means that if you use GenericsContainer with 15 different  

           types�察 �will generate 15 definitions of GenericsContainer while the program is executing。 



                                             ABSTRACTION AND  GENERICS 



              With  generics�察�you can verify and ensure that everything is being said properly�察�with the cost being  

              plexity。 Consider the sentence that clearly described the duck。 To produce it�察�you need to have learned  

        
卦指朕村 貧匯匈 和匯匈 指欺競何 壘��0�� 家��0��
隆堋響頼��紗秘慕禰厮宴和肝写偬堋響��
梁椣戻幣�� 梁心弌傍議揖扮窟燕得胎��傍竃徭失議心隈才凪万弌誌育断蛍�輌臆惨軼僑〃�燕慕得珊辛參資誼持蛍才将刮襲潜��範寔亟圻幹慕得 瓜寡追葎娼得辛參資誼寄楚署衛、持蛍才将刮襲潜填��