4.3 获取泛型的类型2œjG÷ù¡+Œûwww.netcsharp.cn$I$–›J‘Ž\
问题2œjG÷ù¡+Œûwww.netcsharp.cn$I$–›J‘Ž\
您需要在运行时获得一个泛型类型实例的Type对象。2œjG÷ù¡+Œûwww.netcsharp.cn$I$–›J‘Ž\
解决方案2œjG÷ù¡+Œûwww.netcsharp.cn$I$–›J‘Ž\
在使用typeof操作符时提供类型参数;使用类型参数实例化的泛型类型,用GetType()方法。2œjG÷ù¡+Œûwww.netcsharp.cn$I$–›J‘Ž\
声明一个一般类型和一个泛型类型如下:2œjG÷ù¡+Œûwww.netcsharp.cn$I$–›J‘Ž\
2œjG÷ù¡+Œûwww.netcsharp.cn$I$–›J‘Ž\
public class Simple2œjG÷ù¡+Œûwww.netcsharp.cn$I$–›J‘Ž\
{2œjG÷ù¡+Œûwww.netcsharp.cn$I$–›J‘Ž\
   
public Simple()2œjG÷ù¡+Œûwww.netcsharp.cn$I$–›J‘Ž\
   
{2œjG÷ù¡+Œûwww.netcsharp.cn$I$–›J‘Ž\
    }
2œjG÷ù¡+Œûwww.netcsharp.cn$I$–›J‘Ž\
}
2œjG÷ù¡+Œûwww.netcsharp.cn$I$–›J‘Ž\
2œjG÷ù¡+Œûwww.netcsharp.cn$I$–›J‘Ž\
public class SimpleGeneric<T>2œjG÷ù¡+Œûwww.netcsharp.cn$I$–›J‘Ž\
{2œjG÷ù¡+Œûwww.netcsharp.cn$I$–›J‘Ž\
   
public SimpleGeneric()2œjG÷ù¡+Œûwww.netcsharp.cn$I$–›J‘Ž\
   
{2œjG÷ù¡+Œûwww.netcsharp.cn$I$–›J‘Ž\
    }
2œjG÷ù¡+Œûwww.netcsharp.cn$I$–›J‘Ž\
}
2œjG÷ù¡+Œûwww.netcsharp.cn$I$–›J‘Ž\
2œjG÷ù¡+Œûwww.netcsharp.cn$I$–›J‘Ž\
2œjG÷ù¡+Œûwww.netcsharp.cn$I$–›J‘Ž\
  使用typeof操作符和简单类型的名称就可以在运行时获得简单类型的类型。对于泛型类型来说,在调用typeof时类型参数必须要提供,但是简单类型实例和泛型类型实例都可以使用相同的方式来调用GetType()2œjG÷ù¡+Œûwww.netcsharp.cn$I$–›J‘Ž\
2œjG÷ù¡+Œûwww.netcsharp.cn$I$–›J‘Ž\
    Simple s = new Simple();2œjG÷ù¡+Œûwww.netcsharp.cn$I$–›J‘Ž\
    Type t
= typeof(Simple);2œjG÷ù¡+Œûwww.netcsharp.cn$I$–›J‘Ž\
    Type alsoT
= s.GetType();2œjG÷ù¡+Œûwww.netcsharp.cn$I$–›J‘Ž\
   
//提供类型参数就才可以获得类型实例2œjG÷ù¡+Œûwww.netcsharp.cn$I$–›J‘Ž\
    Type gtInt = typeof(SimpleGeneric<int>);2œjG÷ù¡+Œûwww.netcsharp.cn$I$–›J‘Ž\
    Type gtBool
= typeof(SimpleGeneric<bool>);2œjG÷ù¡+Œûwww.netcsharp.cn$I$–›J‘Ž\
    Type gtString
= typeof(SimpleGeneric<string>);2œjG÷ù¡+Œûwww.netcsharp.cn$I$–›J‘Ž\
   
// 当有一个泛型类实例时,您也可以使用GetType的旧的方式去调用一个实例。.2œjG÷ù¡+Œûwww.netcsharp.cn$I$–›J‘Ž\
    SimpleGeneric<int> sgI = new SimpleGeneric<int>();2œjG÷ù¡+Œûwww.netcsharp.cn$I$–›J‘Ž\
    Type alsoGT
= sgI.GetType();2œjG÷ù¡+Œûwww.netcsharp.cn$I$–›J‘Ž\
2œjG÷ù¡+Œûwww.netcsharp.cn$I$–›J‘Ž\
2œjG÷ù¡+Œûwww.netcsharp.cn$I$–›J‘Ž\
  讨论2œjG÷ù¡+Œûwww.netcsharp.cn$I$–›J‘Ž\
不能直接获取泛型类的类型,因为如果不提供一个类型参数,泛型类将没有类型(参考秘诀4.2获得更多信息)。只有通过类型参数实例化的泛型类才有Type2œjG÷ù¡+Œûwww.netcsharp.cn$I$–›J‘Ž\
如果您在使用typeof操作符时,只提供泛型类型定义而不提供类型参数,将得到下面的错误:2œjG÷ù¡+Œûwww.netcsharp.cn$I$–›J‘Ž\
    // 这产生一个错误:2œjG÷ù¡+Œûwww.netcsharp.cn$I$–›J‘Ž\
   
// Error 26 Using the generic type 'CSharpRecipes.Generics.SimpleGeneric<T>'2œjG÷ù¡+Œûwww.netcsharp.cn$I$–›J‘Ž\
   
// requires '1' type arguments2œjG÷ù¡+Œûwww.netcsharp.cn$I$–›J‘Ž\
    Type gt = typeof(SimpleGeneric);2œjG÷ù¡+Œûwww.netcsharp.cn$I$–›J‘Ž\
2œjG÷ù¡+Œûwww.netcsharp.cn$I$–›J‘Ž\
2œjG÷ù¡+Œûwww.netcsharp.cn$I$–›J‘Ž\
  阅读参考2œjG÷ù¡+Œûwww.netcsharp.cn$I$–›J‘Ž\
查看秘诀4.2;参考MSDN文档中的“typeof”主题。2œjG÷ù¡+Œûwww.netcsharp.cn$I$–›J‘Ž\
2œjG÷ù¡+Œûwww.netcsharp.cn$I$–›J‘Ž\
4.4 使用相应的泛型版本替换ArrayList2œjG÷ù¡+Œûwww.netcsharp.cn$I$–›J‘Ž\
问题2œjG÷ù¡+Œûwww.netcsharp.cn$I$–›J‘Ž\
您希望通过将所有ArrayList对象替换为相应的泛型版本以提高应用程序的效率,并使得代码更易于使用。当结构体或其他值类型存储在这些数据结构中时,会导致装箱/拆箱操作,这时就需要这么做。2œjG÷ù¡+Œûwww.netcsharp.cn$I$–›J‘Ž\
解决方案2œjG÷ù¡+Œûwww.netcsharp.cn$I$–›J‘Ž\
使用更有效率的泛型类System.Collections.Generic.List来替换已存在的System.Collection.ArrayList类。2œjG÷ù¡+Œûwww.netcsharp.cn$I$–›J‘Ž\
下面是使用System.Collection.ArrayList对象的简单例子:2œjG÷ù¡+Œûwww.netcsharp.cn$I$–›J‘Ž\
2œjG÷ù¡+Œûwww.netcsharp.cn$I$–›J‘Ž\
    public static void UseNonGenericArrayList()2œjG÷ù¡+Œûwww.netcsharp.cn$I$–›J‘Ž\
   
{2œjG÷ù¡+Œûwww.netcsharp.cn$I$–›J‘Ž\
       
// 创建一个ArrayList.2œjG÷ù¡+Œûwww.netcsharp.cn$I$–›J‘Ž\
        ArrayList numbers = new ArrayList();2œjG÷ù¡+Œûwww.netcsharp.cn$I$–›J‘Ž\
        numbers.Add(
1); // 导致装箱操作2œjG÷ù¡+Œûwww.netcsharp.cn$I$–›J‘Ž\
        numbers.Add(2); // 导致装箱操作2œjG÷ù¡+Œûwww.netcsharp.cn$I$–›J‘Ž\
       
// 显示ArrayList内的所有整数2œjG÷ù¡+Œûwww.netcsharp.cn$I$–›J‘Ž\
       
// 每次迭代都导致拆箱操作2œjG÷ù¡+Œûwww.netcsharp.cn$I$–›J‘Ž\
       
foreach (int i in numbers)2œjG÷ù¡+Œûwww.netcsharp.cn$I$–›J‘Ž\
       
{2œjG÷ù¡+Œûwww.netcsharp.cn$I$–›J‘Ž\
            Console.WriteLine(i);2œjG÷ù¡+Œûwww.netcsharp.cn$I$–›J‘Ž\
        }
2œjG÷ù¡+Œûwww.netcsharp.cn$I$–›J‘Ž\
        numbers.Clear();2œjG÷ù¡+Œûwww.netcsharp.cn$I$–›J‘Ž\
}
2œjG÷ù¡+Œûwww.netcsharp.cn$I$–›J‘Ž\
2œjG÷ù¡+Œûwww.netcsharp.cn$I$–›J‘Ž\
  相同的代码使用了System.Collections.Generic.List对象2œjG÷ù¡+Œûwww.netcsharp.cn$I$–›J‘Ž\
    public static void UseGenericList()2œjG÷ù¡+Œûwww.netcsharp.cn$I$–›J‘Ž\
   
{2œjG÷ù¡+Œûwww.netcsharp.cn$I$–›J‘Ž\
       
// 创建一个List.2œjG÷ù¡+Œûwww.netcsharp.cn$I$–›J‘Ž\
        List<int> numbers = new List<int>();2œjG÷ù¡+Œûwww.netcsharp.cn$I$–›J‘Ž\
        numbers.Add(
1);2œjG÷ù¡+Œûwww.netcsharp.cn$I$–›J‘Ž\
        numbers.Add(
2);2œjG÷ù¡+Œûwww.netcsharp.cn$I$–›J‘Ž\
       
// 显示List中的所有整数.2œjG÷ù¡+Œûwww.netcsharp.cn$I$–›J‘Ž\
       
foreach (int i in numbers)2œjG÷ù¡+Œûwww.netcsharp.cn$I$–›J‘Ž\
       
{2œjG÷ù¡+Œûwww.netcsharp.cn$I$–›J‘Ž\
            Console.WriteLine(i);2œjG÷ù¡+Œûwww.netcsharp.cn$I$–›J‘Ž\
        }
2œjG÷ù¡+Œûwww.netcsharp.cn$I$–›J‘Ž\
        numbers.Clear();2œjG÷ù¡+Œûwww.netcsharp.cn$I$–›J‘Ž\
}
2œjG÷ù¡+Œûwww.netcsharp.cn$I$–›J‘Ž\
2œjG÷ù¡+Œûwww.netcsharp.cn$I$–›J‘Ž\
  讨论2œjG÷ù¡+Œûwww.netcsharp.cn$I$–›J‘Ž\
因为所有的应用程序几乎都会使用ArrayList,从提升您的应用程序的执行效率开始是一个不错的选择。对于应用程序中简单使用ArrayList的地方来说,这种替代是非常容易的。但有些地方需要注意,例如,泛型List类未实现Icloneable接口而ArrayList实现了它。2œjG÷ù¡+Œûwww.netcsharp.cn$I$–›J‘Ž\
4-1显示了两个类中的等价成员。2œjG÷ù¡+Œûwww.netcsharp.cn$I$–›J‘Ž\

ArrayList类成员

2œjG÷ù¡+Œûwww.netcsharp.cn$I$–›J‘Ž\

等价的泛型List类成员

2œjG÷ù¡+Œûwww.netcsharp.cn$I$–›J‘Ž\

Capacity 属性

2œjG÷ù¡+Œûwww.netcsharp.cn$I$–›J‘Ž\

Capacity属性

2œjG÷ù¡+Œûwww.netcsharp.cn$I$–›J‘Ž\

Count属性

2œjG÷ù¡+Œûwww.netcsharp.cn$I$–›J‘Ž\

Count属性

2œjG÷ù¡+Œûwww.netcsharp.cn$I$–›J‘Ž\

IsFixedSize属性

2œjG÷ù¡+Œûwww.netcsharp.cn$I$–›J‘Ž\

((IList)myList).IsFixedSize

2œjG÷ù¡+Œûwww.netcsharp.cn$I$–›J‘Ž\

IsReadOnly属性

2œjG÷ù¡+Œûwww.netcsharp.cn$I$–›J‘Ž\

((IList)myList).IsReadOnly

2œjG÷ù¡+Œûwww.netcsharp.cn$I$–›J‘Ž\

IsSynchronized属性

2œjG÷ù¡+Œûwww.netcsharp.cn$I$–›J‘Ž\

((IList)myList).IsSynchronized

2œjG÷ù¡+Œûwww.netcsharp.cn$I$–›J‘Ž\

Item属性

2œjG÷ù¡+Œûwww.netcsharp.cn$I$–›J‘Ž\

Item属性

2œjG÷ù¡+Œûwww.netcsharp.cn$I$–›J‘Ž\

SyncRoot属性

2œjG÷ù¡+Œûwww.netcsharp.cn$I$–›J‘Ž\

((IList)myList).SyncRoot

2œjG÷ù¡+Œûwww.netcsharp.cn$I$–›J‘Ž\

Adapter 静态方法

2œjG÷ù¡+Œûwww.netcsharp.cn$I$–›J‘Ž\

N/A

2œjG÷ù¡+Œûwww.netcsharp.cn$I$–›J‘Ž\

Add 方法

2œjG÷ù¡+Œûwww.netcsharp.cn$I$–›J‘Ž\

Add方法

2œjG÷ù¡+Œûwww.netcsharp.cn$I$–›J‘Ž\

AddRange方法

2œjG÷ù¡+Œûwww.netcsharp.cn$I$–›J‘Ž\

AddRange方法

2œjG÷ù¡+Œûwww.netcsharp.cn$I$–›J‘Ž\

N/A

2œjG÷ù¡+Œûwww.netcsharp.cn$I$–›J‘Ž\

AsReadOnly方法

2œjG÷ù¡+Œûwww.netcsharp.cn$I$–›J‘Ž\

BinarySearch方法

2œjG÷ù¡+Œûwww.netcsharp.cn$I$–›J‘Ž\

BinarySearch方法

2œjG÷ù¡+Œûwww.netcsharp.cn$I$–›J‘Ž\

Clear方法

2œjG÷ù¡+Œûwww.netcsharp.cn$I$–›J‘Ž\

Clear方法

2œjG÷ù¡+Œûwww.netcsharp.cn$I$–›J‘Ž\

Clone方法

2œjG÷ù¡+Œûwww.netcsharp.cn$I$–›J‘Ž\

Getrange(0, numbers.Count)

2œjG÷ù¡+Œûwww.netcsharp.cn$I$–›J‘Ž\

Contains方法

2œjG÷ù¡+Œûwww.netcsharp.cn$I$–›J‘Ž\

Contains方法

2œjG÷ù¡+Œûwww.netcsharp.cn$I$–›J‘Ž\

N/A

2œjG÷ù¡+Œûwww.netcsharp.cn$I$–›J‘Ž\

ConvertAll方法

2œjG÷ù¡+Œûwww.netcsharp.cn$I$–›J‘Ž\

CopyTo方法

2œjG÷ù¡+Œûwww.netcsharp.cn$I$–›J‘Ž\

CopyTo方法

2œjG÷ù¡+Œûwww.netcsharp.cn$I$–›J‘Ž\

N/A

2œjG÷ù¡+Œûwww.netcsharp.cn$I$–›J‘Ž\

Exists方法

2œjG÷ù¡+Œûwww.netcsharp.cn$I$–›J‘Ž\

N/A

2œjG÷ù¡+Œûwww.netcsharp.cn$I$–›J‘Ž\

Find方法

2œjG÷ù¡+Œûwww.netcsharp.cn$I$–›J‘Ž\

N/A

2œjG÷ù¡+Œûwww.netcsharp.cn$I$–›J‘Ž\

FindAll方法

2œjG÷ù¡+Œûwww.netcsharp.cn$I$–›J‘Ž\

N/A

2œjG÷ù¡+Œûwww.netcsharp.cn$I$–›J‘Ž\

FindIndex方法

2œjG÷ù¡+Œûwww.netcsharp.cn$I$–›J‘Ž\

N/A

2œjG÷ù¡+Œûwww.netcsharp.cn$I$–›J‘Ž\

FindLast方法

2œjG÷ù¡+Œûwww.netcsharp.cn$I$–›J‘Ž\

N/A

2œjG÷ù¡+Œûwww.netcsharp.cn$I$–›J‘Ž\

FindLastIndex方法

2œjG÷ù¡+Œûwww.netcsharp.cn$I$–›J‘Ž\

N/A

2œjG÷ù¡+Œûwww.netcsharp.cn$I$–›J‘Ž\

ForEach方法

2œjG÷ù¡+Œûwww.netcsharp.cn$I$–›J‘Ž\

FixedSize 静态方法

2œjG÷ù¡+Œûwww.netcsharp.cn$I$–›J‘Ž\

N/A

2œjG÷ù¡+Œûwww.netcsharp.cn$I$–›J‘Ž\

Getrange方法

2œjG÷ù¡+Œûwww.netcsharp.cn$I$–›J‘Ž\

Getrange方法

2œjG÷ù¡+Œûwww.netcsharp.cn$I$–›J‘Ž\

IndexOf方法

2œjG÷ù¡+Œûwww.netcsharp.cn$I$–›J‘Ž\

IndexOf方法

2œjG÷ù¡+Œûwww.netcsharp.cn$I$–›J‘Ž\

Insert方法

2œjG÷ù¡+Œûwww.netcsharp.cn$I$–›J‘Ž\

Insert方法

2œjG÷ù¡+Œûwww.netcsharp.cn$I$–›J‘Ž\

InsertRange方法

2œjG÷ù¡+Œûwww.netcsharp.cn$I$–›J‘Ž\

InsertRange方法

2œjG÷ù¡+Œûwww.netcsharp.cn$I$–›J‘Ž\

LastIndexOf方法

2œjG÷ù¡+Œûwww.netcsharp.cn$I$–›J‘Ž\

LastIndexOf方法

2œjG÷ù¡+Œûwww.netcsharp.cn$I$–›J‘Ž\

ReadOnly 静态方法

2œjG÷ù¡+Œûwww.netcsharp.cn$I$–›J‘Ž\

AsReadOnly方法

2œjG÷ù¡+Œûwww.netcsharp.cn$I$–›J‘Ž\

Remove方法

2œjG÷ù¡+Œûwww.netcsharp.cn$I$–›J‘Ž\

Remove方法

2œjG÷ù¡+Œûwww.netcsharp.cn$I$–›J‘Ž\

N/A

2œjG÷ù¡+Œûwww.netcsharp.cn$I$–›J‘Ž\

RemoveAll方法

2œjG÷ù¡+Œûwww.netcsharp.cn$I$–›J‘Ž\

RemoveAt方法

2œjG÷ù¡+Œûwww.netcsharp.cn$I$–›J‘Ž\

RemoveAt方法

2œjG÷ù¡+Œûwww.netcsharp.cn$I$–›J‘Ž\

RemoveRange方法

2œjG÷ù¡+Œûwww.netcsharp.cn$I$–›J‘Ž\

RemoveRange方法

2œjG÷ù¡+Œûwww.netcsharp.cn$I$–›J‘Ž\

Repeat 静态方法

2œjG÷ù¡+Œûwww.netcsharp.cn$I$–›J‘Ž\

使用for循环和Add方法

2œjG÷ù¡+Œûwww.netcsharp.cn$I$–›J‘Ž\

Reverse方法

2œjG÷ù¡+Œûwww.netcsharp.cn$I$–›J‘Ž\

Reverse方法

2œjG÷ù¡+Œûwww.netcsharp.cn$I$–›J‘Ž\

SetRange方法

2œjG÷ù¡+Œûwww.netcsharp.cn$I$–›J‘Ž\

InsertRange方法

2œjG÷ù¡+Œûwww.netcsharp.cn$I$–›J‘Ž\

Sort方法

2œjG÷ù¡+Œûwww.netcsharp.cn$I$–›J‘Ž\

Sort方法

2œjG÷ù¡+Œûwww.netcsharp.cn$I$–›J‘Ž\

Synchronized 静态方法

2œjG÷ù¡+Œûwww.netcsharp.cn$I$–›J‘Ž\

lock(myList.SyncRoot) {…}

2œjG÷ù¡+Œûwww.netcsharp.cn$I$–›J‘Ž\

ToArray方法

2œjG÷ù¡+Œûwww.netcsharp.cn$I$–›J‘Ž\

ToArray方法

2œjG÷ù¡+Œûwww.netcsharp.cn$I$–›J‘Ž\

N/A

2œjG÷ù¡+Œûwww.netcsharp.cn$I$–›J‘Ž\

trimExcess方法

2œjG÷ù¡+Œûwww.netcsharp.cn$I$–›J‘Ž\

TRimToSize方法

2œjG÷ù¡+Œûwww.netcsharp.cn$I$–›J‘Ž\

trimToSize方法

2œjG÷ù¡+Œûwww.netcsharp.cn$I$–›J‘Ž\

N/A

2œjG÷ù¡+Œûwww.netcsharp.cn$I$–›J‘Ž\

trueForAll方法

2œjG÷ù¡+Œûwww.netcsharp.cn$I$–›J‘Ž\
2œjG÷ù¡+Œûwww.netcsharp.cn$I$–›J‘Ž\
4-1中的几个ArrayList的成员和泛型List的成员并非一一对应。从属性开始说,只有CapacityCountItem属性两个类中都存在。为了弥补List类中的几个缺失的属性,可以把它显式转换为Ilist接口。下面的代码演示了如何使用这些显式转换以获得缺失的属性。2œjG÷ù¡+Œûwww.netcsharp.cn$I$–›J‘Ž\
    List<int> numbers = new List<int>();2œjG÷ù¡+Œûwww.netcsharp.cn$I$–›J‘Ž\
    Console.WriteLine(((IList)numbers).IsReadOnly);2œjG÷ù¡+Œûwww.netcsharp.cn$I$–›J‘Ž\
    Console.WriteLine(((IList)numbers).IsFixedSize);2œjG÷ù¡+Œûwww.netcsharp.cn$I$–›J‘Ž\
    Console.WriteLine(((IList)numbers).IsSynchronized);2œjG÷ù¡+Œûwww.netcsharp.cn$I$–›J‘Ž\
    Console.WriteLine(((IList)numbers).SyncRoot);2œjG÷ù¡+Œûwww.netcsharp.cn$I$–›J‘Ž\
2œjG÷ù¡+Œûwww.netcsharp.cn$I$–›J‘Ž\
  注意,由于缺少返回同步版本的泛型List代码和缺少返回固定尺寸的泛型List代码,IsFixedSizeIsSynchronized属性将总是返回falseSyncRoot属性被调用时将总是返回相同的对象,本质上这个属性返回this指针。微软已经决定从所有泛型集合类中去除创建同步成员的功能。做为代替,他们推荐使用lock关键字去锁住整个集合或其他类型的同步对象来满足您的需要。2œjG÷ù¡+Œûwww.netcsharp.cn$I$–›J‘Ž\
静态的ArrayList.Repeat在泛型List中没有对应的方法。做为代替,您可以使用下面的泛型方法:2œjG÷ù¡+Œûwww.netcsharp.cn$I$–›J‘Ž\
    public static void Repeat<T>(List<T> list, T obj, int count)2œjG÷ù¡+Œûwww.netcsharp.cn$I$–›J‘Ž\
   
{2œjG÷ù¡+Œûwww.netcsharp.cn$I$–›J‘Ž\
       
if (count < 0)2œjG÷ù¡+Œûwww.netcsharp.cn$I$–›J‘Ž\
       
{2œjG÷ù¡+Œûwww.netcsharp.cn$I$–›J‘Ž\
           
throw (new ArgumentException(2œjG÷ù¡+Œûwww.netcsharp.cn$I$–›J‘Ž\
                   
"参数count 必须大于或等于零"));2œjG÷ù¡+Œûwww.netcsharp.cn$I$–›J‘Ž\
        }
2œjG÷ù¡+Œûwww.netcsharp.cn$I$–›J‘Ž\
       
for (int index = 0; index < count; index++)2œjG÷ù¡+Œûwww.netcsharp.cn$I$–›J‘Ž\
       
{2œjG÷ù¡+Œûwww.netcsharp.cn$I$–›J‘Ž\
            list.Add(obj);2œjG÷ù¡+Œûwww.netcsharp.cn$I$–›J‘Ž\
        }
2œjG÷ù¡+Œûwww.netcsharp.cn$I$–›J‘Ž\
}
2œjG÷ù¡+Œûwww.netcsharp.cn$I$–›J‘Ž\
2œjG÷ù¡+Œûwww.netcsharp.cn$I$–›J‘Ž\
2œjG÷ù¡+Œûwww.netcsharp.cn$I$–›J‘Ž\
  这个泛型方法有三个参数:2œjG÷ù¡+Œûwww.netcsharp.cn$I$–›J‘Ž\
list2œjG÷ù¡+Œûwww.netcsharp.cn$I$–›J‘Ž\
泛型List对象2œjG÷ù¡+Œûwww.netcsharp.cn$I$–›J‘Ž\
obj2œjG÷ù¡+Œûwww.netcsharp.cn$I$–›J‘Ž\
将被以指定次数添加进泛型List中的对象2œjG÷ù¡+Œûwww.netcsharp.cn$I$–›J‘Ž\
count2œjG÷ù¡+Œûwww.netcsharp.cn$I$–›J‘Ž\
obj添加进泛型类中的次数2œjG÷ù¡+Œûwww.netcsharp.cn$I$–›J‘Ž\
因为Clone方法也没有出现在泛型List类中(因为这个类并没有实现Icloneable接口),您可以使用泛型List类的GetRange方法做为替代。2œjG÷ù¡+Œûwww.netcsharp.cn$I$–›J‘Ž\
List<int> oldList = new List<int>();2œjG÷ù¡+Œûwww.netcsharp.cn$I$–›J‘Ž\
   
// 给oldList添加元素…2œjG÷ù¡+Œûwww.netcsharp.cn$I$–›J‘Ž\
List<int> newList = oldList.GetRange(0, oldList.Count);2œjG÷ù¡+Œûwww.netcsharp.cn$I$–›J‘Ž\
2œjG÷ù¡+Œûwww.netcsharp.cn$I$–›J‘Ž\
2œjG÷ù¡+Œûwww.netcsharp.cn$I$–›J‘Ž\
  GetRange方法对List对象中一个范围的元素执行浅拷贝(跟ArrayList中的Clone方法接近)。在此例中这个范围是所有元素。2œjG÷ù¡+Œûwww.netcsharp.cn$I$–›J‘Ž\
提示:ArrayList默认的初始容量是16个元素,而List<T>的默认初始容量为4个元素。这意味着当添加第17个元素时,List<T>不得不改变尺寸(重新分配内存)3次,而ArrayList只重新分配一次。这一点在评估应用程序性能时需要被考虑。2œjG÷ù¡+Œûwww.netcsharp.cn$I$–›J‘Ž\
阅读参考2œjG÷ù¡+Œûwww.netcsharp.cn$I$–›J‘Ž\
查看MSDN文档中的“System.Collections.ArrayList Class”和“System.Collections.Generic.List Class”主题2œjG÷ù¡+Œûwww.netcsharp.cn$I$–›J‘Ž\