C# List<Object>值拷贝

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Runtime.Serialization.Formatters.Binary;
using System.Text;
namespace ConsoleApplication1
{
    public class Program
    {
        public static void Main(string[] args)
        {
            ItemList listBefore = (ItemList)new List<Item>();
            listBefore.Add(new Item() { ID = 12, Name = "张三" });
            listBefore.Add(new Item() { ID = 18, Name = "李四" });
            ItemList listAfter = new ItemList();
            listAfter = (ItemList)listBefore.Clone();
            Console.WriteLine("Before  未修改" + listBefore[0].ID);
            Console.WriteLine("Before  未修改" + listBefore[0].Name);
            Console.WriteLine();
            Console.WriteLine();
            Console.WriteLine("After  未修改" + listAfter[0].ID);
            Console.WriteLine("After  未修改" + listAfter[0].Name);
            Console.WriteLine();
            Console.WriteLine();
            listAfter[0].ID = 110;
            listAfter[0].Name = "小孩";
            Console.WriteLine("Before  以修改" + listBefore[0].ID);
            Console.WriteLine("Before  以修改" + listBefore[0].Name);
            Console.WriteLine();
            Console.WriteLine();
            Console.WriteLine("After  以修改" + listAfter[0].ID);
            Console.WriteLine("After  以修改" + listAfter[0].Name);
            Console.WriteLine();
            Console.WriteLine();
        }
    }
    [Serializable]
    public class Item
    {
        public int ID { get; set; }
        public string Name { get; set; }
    }
    [Serializable]
    public class ItemList : List<Item>, ICloneable
    {
        public object Clone()
        {
            MemoryStream ms = new MemoryStream();
            object obj;
            try
            {
                BinaryFormatter bf = new BinaryFormatter();
                bf.Serialize(ms, this);
                ms.Seek(0, SeekOrigin.Begin);
                obj = bf.Deserialize(ms);
            }
            finally
            {
                ms.Close();
            }
            return obj;
        }
    }
}
时间: 2024-12-31 03:30:28

C# List<Object>值拷贝的相关文章

C语言中的位拷贝与值拷贝浅谈(转载)

注:C语言实现的PHP变量的赋值过程中,就涉及到了 深拷贝和浅拷贝 位拷贝拷贝的是地址(也叫浅拷贝),而值拷贝则拷贝的是内容(深拷贝).深拷贝和浅拷贝可以简单理解为:如果一个类拥有资源,当这个类的对象发生复制过程的时候,资源重新分配,这个过程就是深拷贝,反之,没有重新分配资源,就是浅拷贝. 位拷贝,及"bitwise assignment"是指将一个对象的内存映像按位原封不动的复制给另一个对象,所谓值拷贝就是指,将原对象的值复制一份给新对象. 在用"bitwise assig

【转载】C++中的位拷贝和值拷贝

---恢复内容开始--- 原文:C++中的位拷贝和值拷贝 原文:http://blog.csdn.net/liam1122/article/details/1966617 为了便于说明我们以String类为例: 首先定义String类,而并不实现其成员函数. Class String { public: String(const char *ch=NULL);//默认构造函数 String(const String &str);//拷贝构造函数 ~String(void); String &

“位拷贝”和“值拷贝”的区别(c++)

以string类为例: 位拷贝拷贝的是地址,而值拷贝拷贝的是内容. 若定义string类的两个对象为str1,str2.str1._str和str2._str分别指向一块空间. str1._str = "zhang",str2._str = "tian". 若默认拷贝构造函数,即str1(str2).编译器将str2进行一份位拷贝.str1和str2指向同一块空间. 若默认赋值函数,即str1 = str2.编译器将str2的值赋值给str1,进行的也是位拷贝. 无

PythonStudy1——Python 值拷贝 浅拷贝 深拷贝

拷贝:对值进行复制的过程 # 值拷贝:应用场景最多  ls = [1, 'abc', [10]] ls1 = ls # ls1直接将ls中存放的地址拿过来  # ls内部的值发生任何变化,ls1都会随之变化 ls2 = ls.copy() # 新开辟列表空间,但列表中的地址都是直接从ls列表中拿来  # ls内部的可变类型值发生改变,ls2会随之变化 ls3 = deepcopy(ls) # 新开辟列表空间,ls列表中的不可变类型的地址直接拿过来,但是可变类型的地址一定重新开辟空间  # ls内

JavaScript中Object值合并方法

前言:在日常开发工作中我们可能会遇到js中对象中所有值的复制工作,也有可能是通过electron开发客户端,改版时候面临到的设置合并问题.那么本文将对此做一个简要解决方案的叙述. 介绍:比如有obj1, obj2,我们需要将obj1中的所有与obj2中相同字段相同深度的值copy给obj2,并且需要保持obj2字段结构不变,调用一下方法即可(采用ES6写法). 1 /** 2 * 将src中的数据copy到dist中,并保留dist的结构 3 * @param src 4 * @param di

直接初始化&amp;拷贝初始化&amp;值初始化

一.变量定义&初始值 0. 变量定义的形式 //形式一 int a; //形式二 int b = 1; 1. 初始值&初始化 对象被初始化:对象在创建时获得了一个特定的值 2. 初始化&赋值 初始化变量的一种方式:用等号=来初始化变量 这种方式让人误以为初始化是赋值的一种,其实不然,初始化不是赋值 初始化:创建变量时赋予其一个初始值 赋值:把对象的当前值擦除,而以一个新值来替代 3. 列表初始化 int a = {0}; int a{0}; 4. 默认初始化 定义变量时没有指定初值

c/c++ 拷贝控制 右值与const引用

拷贝控制 右值与const引用 背景:当一个函数的返回值是自定义类型时,调用侧用什么类型接收?? 1,如果自定义类型的拷贝构造函数的参数用const修饰了:可以用下面的方式接收. Test t2 = fun(t1); 2,如果自定义类型的拷贝构造函数的参数没有用const修饰了:必须用下面的方式接收 const Test& t2 = fun(t1); Test t2 = fun(t1);//编译不通过 编译错误: cannot bind non-const lvalue reference of

C#引用类型和值类型的区别

1***.C#中有两种类型: 值类型和引用类型: 值类型的变量直接包含他们的数据,而引用类型的变量存储 引用类型存储对他们的数据的引用,后者称为对象: 简单说:值类型直接存储其值,引用类型存储对值得引用.引用类型分为引用和引用的对象. 2***. 值类型:简单类型.枚举.结构 引用类型: 类类型.接口类型.数组类型和委托类型 3***.值类型与引用类型的内存存储 单纯的说值类型存储在栈上,引用类型存储在托管堆上是不对的. 4***.区别: 1. 托管堆: 同步块和方法表, x,y,托管堆上的需要

python中非序列类型期望值拷贝的解决方案

看下面这段代码: # -*- coding: utf-8 -*-import copy class Present(object):    def __init__(self, str_cmd):        self._str_cmd = str_cmd        print "进入Present时的地址:", id(self._str_cmd) def set_value(self):        temp = "test_cmd"        sel