惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

G
Google Developers Blog
阮一峰的网络日志
阮一峰的网络日志
IT之家
IT之家
人人都是产品经理
人人都是产品经理
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
博客园 - 【当耐特】
WordPress大学
WordPress大学
Hugging Face - Blog
Hugging Face - Blog
博客园 - 叶小钗
罗磊的独立博客
宝玉的分享
宝玉的分享
月光博客
月光博客
V
V2EX
博客园 - 司徒正美
Vercel News
Vercel News
量子位
Y
Y Combinator Blog
美团技术团队
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
T
Tailwind CSS Blog
博客园 - Franky
小众软件
小众软件
I
InfoQ
A
About on SuperTechFans

博客园 - -Enchant

Linux上搭建Asp.net MVC3环境(CentOS + Nginx + Mono) 《单例模式》你需要注意的问题 系统框架整理 Extjs prompt 显示密码框 Python网页抓取、模拟登录 单点登录(SSO)的一点思考 Jquery以JSON方式调用WebService WCF初探 关于抓取百度搜索内容 iPhone开发环境搭建(备忘) SMTP/POP3命令简介(转) C/S模式下 简单的定时任务功能 Asp.net MVC2学习笔记索引 Oracle 调优 Oracle常见错误 @OutputCache指令参数 关于ACL权限控制【ASP.NET MVC2】 c#递归生成XML ASP.NET MVC2 Ajax返回JSON
引用类型的对象复制(浅复制和深复制)
-Enchant · 2010-03-01 · via 博客园 - -Enchant

引用类型的对象复制,分为浅复制和深复制。。。

浅复制就简单的把地址复制给另一个对象,其中有一个对象发生变化,2个都有变化。

实现方式,实现 ICloneable 接口,调用 MemberwiseClone()方法就可以了。

深复制就完全产生一个新的对象,二者属性一样,但没有任何关联。。

实现方式,可以重新 new 一个对象,也可以通过序列化、反序列化来实现。。

代码:

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

namespace H.DBF
{
    /// 

<summary>
    /// Model对象基类
    /// 
</summary>
    [Serializable]
    public abstract class ObjBase:ICloneable
    {
        #region ICloneable 成员
        /// 
<summary>
        /// 浅复制
        /// 
</summary>
        /// 
<returns></returns>
        public object Clone()
        {
            return this.MemberwiseClone();
        }

        /// 

<summary>
        /// 深度拷贝,使用序列化方式,在数据量大时速度很慢!
        /// 
</summary>
        /// 
<returns></returns>
        public object DeepClone()
        {
            //使用 序列化/反序列化,在数据量大时相当慢!
            object obj;
            using (MemoryStream ms = new MemoryStream())
            {
                BinaryFormatter bf = new BinaryFormatter(null, new System.Runtime.Serialization.StreamingContext());

                bf.Serialize(ms, this);
                ms.Seek(0, SeekOrigin.Begin);

                obj = bf.Deserialize(ms);
                ms.Close();

                return obj;
            }
            //ObjBase obj = (ObjBase) System.Activator.CreateInstance(this.GetType());
            //obj.TableName = this.TableName;
            //obj.Columns = this.Columns;

            //return obj;
        }
        #endregion
    }
}