using System;
using System.Collections;
//引用类型
class RefType
{
}
//值类型
struct ValType
{
}
//
class MemberType:ICloneable
{
private RefType m_r;
private ValType m_v;
public MemberType()
{
}
public MemberType(RefType r,ValType v)
{
this.m_r=r;
this.m_v=v;
}
//实现深度拷贝
public object Clone()
{
//构造一个新的对象
return new MemberType(m_r,m_v);
}
}
class MyType:ICloneable
{
public int i;
public MemberType s;
public MyType()
{
}
public object Clone()
{
//实现深度拷贝
MyType t=new MyType();
t.i=i;
//因为t.s是一个引用类型的字段,所以在深度拷贝的情况下,
//应该调用t.s的Clone方法
t.s=(MemberType)s.Clone();
return t;
//return this.MemberwiseClone();
}
}
class App
{
static void Main(string[] args)
{
MyType m1=new MyType();
m1.i=10;
m1.s=new MemberType();
MyType m2;
//调用m1的Clone方法
m2=(MyType)m1.Clone();
Console.WriteLine("m2.i={0}",m2.i);
//如果是深度拷贝,则m1和m2中的引用字段s应该不是指向
//同一个对象,如果是浅拷贝,则m1和m2的引用字段s应该指向
//同一个对象
if(object.ReferenceEquals(m1.s,m2.s))
{
Console.WriteLine("m1.s and m2.s reference to the same string object");
}
else
{
Console.WriteLine("m1.s and m2.s reference to the different string object");
}
Console.Read();
}
}
using System.Collections;
//引用类型
class RefType
{
}
//值类型
struct ValType
{
}
//
class MemberType:ICloneable
{
private RefType m_r;
private ValType m_v;
public MemberType()
{
}
public MemberType(RefType r,ValType v)
{
this.m_r=r;
this.m_v=v;
}
//实现深度拷贝
public object Clone()
{
//构造一个新的对象
return new MemberType(m_r,m_v);
}
}
class MyType:ICloneable
{
public int i;
public MemberType s;
public MyType()
{
}
public object Clone()
{
//实现深度拷贝
MyType t=new MyType();
t.i=i;
//因为t.s是一个引用类型的字段,所以在深度拷贝的情况下,
//应该调用t.s的Clone方法
t.s=(MemberType)s.Clone();
return t;
//return this.MemberwiseClone();
}
}
class App
{
static void Main(string[] args)
{
MyType m1=new MyType();
m1.i=10;
m1.s=new MemberType();
MyType m2;
//调用m1的Clone方法
m2=(MyType)m1.Clone();
Console.WriteLine("m2.i={0}",m2.i);
//如果是深度拷贝,则m1和m2中的引用字段s应该不是指向
//同一个对象,如果是浅拷贝,则m1和m2的引用字段s应该指向
//同一个对象
if(object.ReferenceEquals(m1.s,m2.s))
{
Console.WriteLine("m1.s and m2.s reference to the same string object");
}
else
{
Console.WriteLine("m1.s and m2.s reference to the different string object");
}
Console.Read();
}
}