程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> .NET實例教程 >> DeepClone與ShadowClone(downmoon)

DeepClone與ShadowClone(downmoon)

編輯:.NET實例教程

杳MSDN知:
ArrayList.Clone 方法

創建ArrayList 的淺表副本。

命名空間:System.Collections
程序集:mscorlib(在 mscorlib.dll 中)

返回值ArrayList 的淺表副本。

集合的淺表副本僅復制集合的元素(不論它們是引用類型還是值類型),但不復制引用所引用的對象。新集合中的引用與原始集合中的引用指向相同的對象。

與之相對,集合的深層副本將復制這些元素以及由它們直接或間接引用的所有內容。

據此,說明如下 :







下面給出一個完整的例子:



using System;
using System.Collections.Generic;
using System.Text;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;

namespace CloneObjectTest
...{

    // Just added to show the difference between shallow and deep cloning
    [Serializable()]
    class SampleRefType
    ...{
        public int Val;
    }

    [Serializable()]
    class Employee
    ...{
        public string m_Name;
        public Int16 m_age;
        public SampleRefType someObject;

        public void Print()
        ...{
            Console.WriteLine("Name : " + m_Name);
            Console.WriteLine("Age : " + m_age);
            Console.WriteLine("Some Value: " + someObject.Val);
        }
        // This is one way to do deep cloning. But works only if the
        // objects and its references are serializable
        public Employee DeepClone()
        ...{
            MemoryStream m = new MemoryStream();
            BinaryFormatter b = new BinaryFormatter();
            b.Serialize(m, this);
            m.Position = 0;
            return (Employee)b.Deserialize(m);
        }
        // Do shallow cloning
        public Employee ShallowClone()
    ...{
            return (Employee)this.MemberwiseClone();
        }
        static void Main(string[] args)
        ...{
            SampleRefType objRef = new SampleRefType();
            objRef.Val = 1000;
            Employee objA = new Employee();
            objA.m_Name = "Manoj";
            objA.m_age = 23;
            objA.someObject = objRef;
            Employee objB = objA.DeepClone();
            Employee objC = objA.ShallowClone();
            //objB is a deep clone. So chages made to objRef would not affect objB''s value.
            //But objC is shallow cloned. So, if the objRef is changed, so is the value in
            //ObjC. So objC should print 2000 whereas objB should print 1000
            objRef.Val = 2000;

            //Updating some state
            objC.m_age = 100;
            objB.m_Name = "New Name";

            Console.WriteLine("Original Object:");
            objA.Print();
            Console.WriteLine();
        Console.WriteLine("Shallow Cloned Object:");
            objC.Print();
            Console.WriteLine();
            Console.WriteLine("Deep Cloned Object:");
            objB.Print();
        }
    }
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved