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

推荐订阅源

F
Fortinet All Blogs
Recent Announcements
Recent Announcements
H
Help Net Security
Y
Y Combinator Blog
酷 壳 – CoolShell
酷 壳 – CoolShell
有赞技术团队
有赞技术团队
小众软件
小众软件
Last Week in AI
Last Week in AI
U
Unit 42
Google DeepMind News
Google DeepMind News
博客园 - 司徒正美
H
Hackread – Cybersecurity News, Data Breaches, AI and More
J
Java Code Geeks
Microsoft Security Blog
Microsoft Security Blog
G
Google Developers Blog
N
Netflix TechBlog - Medium
Blog — PlanetScale
Blog — PlanetScale
云风的 BLOG
云风的 BLOG
V
V2EX
博客园 - 聂微东
人人都是产品经理
人人都是产品经理
博客园 - 三生石上(FineUI控件)
阮一峰的网络日志
阮一峰的网络日志
爱范儿
爱范儿

博客园 - -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
    }
}