zoukankan      html  css  js  c++  java
  • 对象复制

    浅度复制(MemberwiseClone)

    演示代码:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    
    
    namespace EventDemo
    {
        public class RefPoint
        {      // 定义一个引用类型
            public int x;
            public RefPoint(int x)
            {
                this.x = x;
            }
        }
    
        public struct ValPoint
        { // 定义一个值类型
            public int x;
            public ValPoint(int x)
            {
                this.x = x;
            }
        }
    
        // 将要进行 浅度复制 的对象,注意为 引用类型
        public class RefLine : ICloneable
        {
            public RefPoint rPoint;
            public ValPoint vPoint;
            public RefLine(RefPoint rPoint, ValPoint vPoint)
            {
                this.rPoint = rPoint;
                this.vPoint = vPoint;
            }
    
            public object Clone()
            {
                return MemberwiseClone();
            }
        }
    
        class Program
        {
            static void Main(string[] args)
            {
                RefPoint rPoint = new RefPoint(1);
                ValPoint vPoint = new ValPoint(1);
                RefLine line = new RefLine(rPoint, vPoint);
    
                RefLine newLine = (RefLine)line.Clone();
                Console.WriteLine("Original: line.rPoint.x = {0}, line.vPoint.x = {1}", line.rPoint.x, line.vPoint.x);
                Console.WriteLine("Cloned: newLine.rPoint.x = {0}, newLine.vPoint.x = {1}", newLine.rPoint.x, newLine.vPoint.x);
    
                line.rPoint.x = 10;      // 修改原先的line的 引用类型成员 rPoint
                line.vPoint.x = 10;      // 修改原先的line的 值类型  成员 vPoint
                Console.WriteLine("Original: line.rPoint.x = {0}, line.vPoint.x = {1}", line.rPoint.x, line.vPoint.x);
                Console.WriteLine("Cloned: newLine.rPoint.x = {0}, newLine.vPoint.x = {1}", newLine.rPoint.x, newLine.vPoint.x);
    
                Console.ReadLine();
    
            }
        }
    }
    View Code

    深度复制

      演示代码:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    
    
    namespace EventDemo
    {
        public class RefPoint
        {      // 定义一个引用类型
            public int x;
            public RefPoint(int x)
            {
                this.x = x;
            }
        }
    
        public struct ValPoint
        { // 定义一个值类型
            public int x;
            public ValPoint(int x)
            {
                this.x = x;
            }
        }
    
        // 将要进行 浅度复制 的对象,注意为 引用类型
        public class RefLine : ICloneable
        {
            public RefPoint rPoint;
            public ValPoint vPoint;
            public RefLine(RefPoint rPoint, ValPoint vPoint)
            {
                this.rPoint = rPoint;
                this.vPoint = vPoint;
            }
    
            public object Clone()
            {
                RefPoint rPoint = new RefPoint(this.rPoint.x);       // 对于引用类型,创建新对象
                ValPoint vPoint = this.vPoint;          // 值类型,直接赋值
                RefLine newLine = new RefLine(rPoint, vPoint);
                return newLine;
            }
        }
    
        class Program
        {
            static void Main(string[] args)
            {
                RefPoint rPoint = new RefPoint(1);
                ValPoint vPoint = new ValPoint(1);
                RefLine line = new RefLine(rPoint, vPoint);
    
                RefLine newLine = (RefLine)line.Clone();
                Console.WriteLine("Original: line.rPoint.x = {0}, line.vPoint.x = {1}", line.rPoint.x, line.vPoint.x);
                Console.WriteLine("Cloned: newLine.rPoint.x = {0}, newLine.vPoint.x = {1}", newLine.rPoint.x, newLine.vPoint.x);
    
                line.rPoint.x = 10;      // 修改原先的line的 引用类型成员 rPoint
                line.vPoint.x = 10;      // 修改原先的line的 值类型  成员 vPoint
                Console.WriteLine("Original: line.rPoint.x = {0}, line.vPoint.x = {1}", line.rPoint.x, line.vPoint.x);
                Console.WriteLine("Cloned: newLine.rPoint.x = {0}, newLine.vPoint.x = {1}", newLine.rPoint.x, newLine.vPoint.x);
    
                Console.ReadLine();
            }
        }
    }
    View Code

    深度复制(序列化方式)

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Runtime.Serialization.Formatters.Binary;
    using System.IO;
    
    
    namespace EventDemo
    {
        [Serializable()]
        public class RefPoint
        {      // 定义一个引用类型
            public int x;
            public RefPoint(int x)
            {
                this.x = x;
            }
        }
    
        [Serializable()]
        public struct ValPoint
        { // 定义一个值类型
            public int x;
            public ValPoint(int x)
            {
                this.x = x;
            }
        }
    
        // 将要进行 浅度复制 的对象,注意为 引用类型
        [Serializable()]
        public class RefLine : ICloneable
        {
            public RefPoint rPoint;
            public ValPoint vPoint;
            public RefLine(RefPoint rPoint, ValPoint vPoint)
            {
                this.rPoint = rPoint;
                this.vPoint = vPoint;
            }
    
            public object Clone()
            {
                BinaryFormatter bf = new BinaryFormatter();
                MemoryStream ms = new MemoryStream();
                bf.Serialize(ms, this);
                ms.Position = 0;
    
                return (bf.Deserialize(ms)); ;
            }
        }
    
        class Program
        {
            static void Main(string[] args)
            {
                RefPoint rPoint = new RefPoint(1);
                ValPoint vPoint = new ValPoint(1);
                RefLine line = new RefLine(rPoint, vPoint);
    
                RefLine newLine = (RefLine)line.Clone();
                Console.WriteLine("Original: line.rPoint.x = {0}, line.vPoint.x = {1}", line.rPoint.x, line.vPoint.x);
                Console.WriteLine("Cloned: newLine.rPoint.x = {0}, newLine.vPoint.x = {1}", newLine.rPoint.x, newLine.vPoint.x);
    
                line.rPoint.x = 10;      // 修改原先的line的 引用类型成员 rPoint
                line.vPoint.x = 10;      // 修改原先的line的 值类型  成员 vPoint
                Console.WriteLine("Original: line.rPoint.x = {0}, line.vPoint.x = {1}", line.rPoint.x, line.vPoint.x);
                Console.WriteLine("Cloned: newLine.rPoint.x = {0}, newLine.vPoint.x = {1}", newLine.rPoint.x, newLine.vPoint.x);
    
                Console.ReadLine();
            }
        }
    }
    View Code
  • 相关阅读:
    codevs 2602 最短路径问题x
    codevs 1077 多源最短路x
    2010TianjinRegional 部分题解
    [CF706D]Vasiliy's Multiset(异或字典树)
    [CF710E]Generate a String(DP)
    [CF710C]Magic Odd Square(构造)
    [CF151B]Phone Numbers(暴力,模拟)
    [POJ2104]K-th Number(主席树,静态区间k小)
    [CF707D]Persistent Bookcase(离线,DFS)
    [CF707C]Pythagorean Triples(数学)
  • 原文地址:https://www.cnblogs.com/scmail81/p/8678967.html
Copyright © 2011-2022 走看看