杳MSDN知:
ArrayList.Clone 方法
創建ArrayList 的淺表副本。
命名空間:System.Collections
程序集:mscorlib(在 mscorlib.dll 中)
返回值ArrayList 的淺表副本。
集合的淺表副本僅復制集合的元素(不論它們是引用類型還是值類型),但不復制引用所引用的對象。新集合中的引用與原始集合中的引用指向相同的對象。
與之相對,集合的深層副本將復制這些元素以及由它們直接或間接引用的所有內容。
據此,說明如下 :
![](https://www.aspphp.online/bianchen/UploadFiles_4619/201701/2017011311464180.jpg)
![](https://www.aspphp.online/bianchen/UploadFiles_4619/201701/2017011311464105.jpg)
下面給出一個完整的例子:
![](https://www.aspphp.online/bianchen/UploadFiles_4619/201701/2017011311464194.gif)
using System;
![](https://www.aspphp.online/bianchen/UploadFiles_4619/201701/2017011311464194.gif)
using System.Collections.Generic;
![](https://www.aspphp.online/bianchen/UploadFiles_4619/201701/2017011311464194.gif)
using System.Text;
![](https://www.aspphp.online/bianchen/UploadFiles_4619/201701/2017011311464194.gif)
using System.IO;
![](https://www.aspphp.online/bianchen/UploadFiles_4619/201701/2017011311464194.gif)
using System.Runtime.Serialization.Formatters.Binary;
![](https://www.aspphp.online/bianchen/UploadFiles_4619/201701/2017011311464194.gif)
![](https://www.aspphp.online/bianchen/UploadFiles_4619/201701/2017011311464194.gif)
namespace CloneObjectTest
![](https://www.aspphp.online/bianchen/UploadFiles_4619/201701/2017011311464205.gif)
![](https://www.aspphp.online/bianchen/UploadFiles_4619/201701/2017011311464241.gif)
...{
![](https://www.aspphp.online/bianchen/UploadFiles_4619/201701/2017011311464213.gif)
![](https://www.aspphp.online/bianchen/UploadFiles_4619/201701/2017011311464213.gif)
// Just added to show the difference between shallow and deep cloning
![](https://www.aspphp.online/bianchen/UploadFiles_4619/201701/2017011311464213.gif)
[Serializable()]
![](https://www.aspphp.online/bianchen/UploadFiles_4619/201701/2017011311464213.gif)
class SampleRefType
![](https://www.aspphp.online/bianchen/UploadFiles_4619/201701/2017011311464262.gif)
![](https://www.aspphp.online/bianchen/UploadFiles_4619/201701/2017011311464218.gif)
...{
![](https://www.aspphp.online/bianchen/UploadFiles_4619/201701/2017011311464213.gif)
public int Val;
![](https://www.aspphp.online/bianchen/UploadFiles_4619/201701/2017011311464239.gif)
}
![](https://www.aspphp.online/bianchen/UploadFiles_4619/201701/2017011311464213.gif)
![](https://www.aspphp.online/bianchen/UploadFiles_4619/201701/2017011311464213.gif)
[Serializable()]
![](https://www.aspphp.online/bianchen/UploadFiles_4619/201701/2017011311464213.gif)
class Employee
![](https://www.aspphp.online/bianchen/UploadFiles_4619/201701/2017011311464262.gif)
![](https://www.aspphp.online/bianchen/UploadFiles_4619/201701/2017011311464218.gif)
...{
![](https://www.aspphp.online/bianchen/UploadFiles_4619/201701/2017011311464213.gif)
public string m_Name;
![](https://www.aspphp.online/bianchen/UploadFiles_4619/201701/2017011311464213.gif)
public Int16 m_age;
![](https://www.aspphp.online/bianchen/UploadFiles_4619/201701/2017011311464213.gif)
public SampleRefType someObject;
![](https://www.aspphp.online/bianchen/UploadFiles_4619/201701/2017011311464213.gif)
![](https://www.aspphp.online/bianchen/UploadFiles_4619/201701/2017011311464213.gif)
public void Print()
![](https://www.aspphp.online/bianchen/UploadFiles_4619/201701/2017011311464262.gif)
![](https://www.aspphp.online/bianchen/UploadFiles_4619/201701/2017011311464218.gif)
...{
![](https://www.aspphp.online/bianchen/UploadFiles_4619/201701/2017011311464213.gif)
Console.WriteLine("Name : " + m_Name);
![](https://www.aspphp.online/bianchen/UploadFiles_4619/201701/2017011311464213.gif)
Console.WriteLine("Age : " + m_age);
![](https://www.aspphp.online/bianchen/UploadFiles_4619/201701/2017011311464213.gif)
Console.WriteLine("Some Value: " + someObject.Val);
![](https://www.aspphp.online/bianchen/UploadFiles_4619/201701/2017011311464239.gif)
}
![](https://www.aspphp.online/bianchen/UploadFiles_4619/201701/2017011311464213.gif)
// This is one way to do deep cloning. But works only if the
![](https://www.aspphp.online/bianchen/UploadFiles_4619/201701/2017011311464213.gif)
// objects and its references are serializable
![](https://www.aspphp.online/bianchen/UploadFiles_4619/201701/2017011311464213.gif)
public Employee DeepClone()
![](https://www.aspphp.online/bianchen/UploadFiles_4619/201701/2017011311464262.gif)
![](https://www.aspphp.online/bianchen/UploadFiles_4619/201701/2017011311464218.gif)
...{
![](https://www.aspphp.online/bianchen/UploadFiles_4619/201701/2017011311464213.gif)
MemoryStream m = new MemoryStream();
![](https://www.aspphp.online/bianchen/UploadFiles_4619/201701/2017011311464213.gif)
BinaryFormatter b = new BinaryFormatter();
![](https://www.aspphp.online/bianchen/UploadFiles_4619/201701/2017011311464213.gif)
b.Serialize(m, this);
![](https://www.aspphp.online/bianchen/UploadFiles_4619/201701/2017011311464213.gif)
m.Position = 0;
![](https://www.aspphp.online/bianchen/UploadFiles_4619/201701/2017011311464213.gif)
return (Employee)b.Deserialize(m);
![](https://www.aspphp.online/bianchen/UploadFiles_4619/201701/2017011311464239.gif)
}
![](https://www.aspphp.online/bianchen/UploadFiles_4619/201701/2017011311464213.gif)
// Do shallow cloning
![](https://www.aspphp.online/bianchen/UploadFiles_4619/201701/2017011311464213.gif)
public Employee ShallowClone()
![](https://www.aspphp.online/bianchen/UploadFiles_4619/201701/2017011311464262.gif)
...{
![](https://www.aspphp.online/bianchen/UploadFiles_4619/201701/2017011311464213.gif)
return (Employee)this.MemberwiseClone();
![](https://www.aspphp.online/bianchen/UploadFiles_4619/201701/2017011311464239.gif)
}
![](https://www.aspphp.online/bianchen/UploadFiles_4619/201701/2017011311464213.gif)
static void Main(string[] args)
![](https://www.aspphp.online/bianchen/UploadFiles_4619/201701/2017011311464262.gif)
![](https://www.aspphp.online/bianchen/UploadFiles_4619/201701/2017011311464218.gif)
...{
![](https://www.aspphp.online/bianchen/UploadFiles_4619/201701/2017011311464213.gif)
SampleRefType objRef = new SampleRefType();
![](https://www.aspphp.online/bianchen/UploadFiles_4619/201701/2017011311464213.gif)
objRef.Val = 1000;
![](https://www.aspphp.online/bianchen/UploadFiles_4619/201701/2017011311464213.gif)
Employee objA = new Employee();
![](https://www.aspphp.online/bianchen/UploadFiles_4619/201701/2017011311464213.gif)
objA.m_Name = "Manoj";
![](https://www.aspphp.online/bianchen/UploadFiles_4619/201701/2017011311464213.gif)
objA.m_age = 23;
![](https://www.aspphp.online/bianchen/UploadFiles_4619/201701/2017011311464213.gif)
objA.someObject = objRef;
![](https://www.aspphp.online/bianchen/UploadFiles_4619/201701/2017011311464213.gif)
Employee objB = objA.DeepClone();
![](https://www.aspphp.online/bianchen/UploadFiles_4619/201701/2017011311464213.gif)
Employee objC = objA.ShallowClone();
![](https://www.aspphp.online/bianchen/UploadFiles_4619/201701/2017011311464213.gif)
//objB is a deep clone. So chages made to objRef would not affect objB''s value.
![](https://www.aspphp.online/bianchen/UploadFiles_4619/201701/2017011311464213.gif)
//But objC is shallow cloned. So, if the objRef is changed, so is the value in
![](https://www.aspphp.online/bianchen/UploadFiles_4619/201701/2017011311464213.gif)
//ObjC. So objC should print 2000 whereas objB should print 1000
![](https://www.aspphp.online/bianchen/UploadFiles_4619/201701/2017011311464213.gif)
objRef.Val = 2000;
![](https://www.aspphp.online/bianchen/UploadFiles_4619/201701/2017011311464213.gif)
![](https://www.aspphp.online/bianchen/UploadFiles_4619/201701/2017011311464213.gif)
//Updating some state
![](https://www.aspphp.online/bianchen/UploadFiles_4619/201701/2017011311464213.gif)
objC.m_age = 100;
![](https://www.aspphp.online/bianchen/UploadFiles_4619/201701/2017011311464213.gif)
objB.m_Name = "New Name";
![](https://www.aspphp.online/bianchen/UploadFiles_4619/201701/2017011311464213.gif)
![](https://www.aspphp.online/bianchen/UploadFiles_4619/201701/2017011311464213.gif)
Console.WriteLine("Original Object:");
![](https://www.aspphp.online/bianchen/UploadFiles_4619/201701/2017011311464213.gif)
objA.Print();
![](https://www.aspphp.online/bianchen/UploadFiles_4619/201701/2017011311464213.gif)
Console.WriteLine();
Console.WriteLine("Shallow Cloned Object:");
![](https://www.aspphp.online/bianchen/UploadFiles_4619/201701/2017011311464213.gif)
objC.Print();
![](https://www.aspphp.online/bianchen/UploadFiles_4619/201701/2017011311464213.gif)
Console.WriteLine();
![](https://www.aspphp.online/bianchen/UploadFiles_4619/201701/2017011311464213.gif)
Console.WriteLine("Deep Cloned Object:");
![](https://www.aspphp.online/bianchen/UploadFiles_4619/201701/2017011311464213.gif)
objB.Print();
![](https://www.aspphp.online/bianchen/UploadFiles_4619/201701/2017011311464239.gif)
}
![](https://www.aspphp.online/bianchen/UploadFiles_4619/201701/2017011311464239.gif)
}