C#开发常见面试题三(浅复制和深复制的区别)

C#开发常见面试题三(浅复制和深复制的区别)

一.浅复制和深复制定义

(1)浅复制:复制一个对象的时候,仅仅复制原始对象中所有的非静态类型成员和所有的引用类型成员的引用。(新对象和原对象将共享所有引用类型成员的实际对象)

(2)深复制:复制一个对象的时候,不仅复制所有非静态类型成员,还要复制所有引用类型成员的实际对象

在.NET中,基类System.Object已经为所有类型都实现了浅复制,类型所要做的就是公开一个复制的接口,而通常的,这个接口会由ICloneable接口来实现。ICloneable只包含一个方法Clone,该方法既可以被实现为浅复制也可以被实现为深复制,具体如何取舍则根据具体类型的需求决定。此外,在Sys-tem.Object基类中,有一个保护的MemeberwiseClone()方法,它便用于进行浅度复制。

二.代码理解

    public object Clone()
    {    
        return MemberwiseClone();
    }

实例

    public class DeepCopy : ICloneable
    {
        public int i = 0;
        public A a = new A();

        public object Clone()
        {
            // 实现深复制-方式1:依次赋值和实例化
            DeepCopy newObj = new DeepCopy();
            newObj.a = new A();
            newObj.a.message = this.a.message;
            newObj.i = this.i;

            return newObj;
        }

        public new object MemberwiseClone()
        {
            // 实现浅复制
            return base.MemberwiseClone();
        }

        public override string ToString()
        {
            string result = string.Format("I的值为{0},A为{1}", this.i.ToString(), this.a.message);
            return result;
        }
    }

    public class A
    {
        public string message = "我是原始A";
    }

    public class Program
    {
        static void Main(string[] args)
        {
            DeepCopy dc = new DeepCopy();
            dc.i = 10;
            dc.a = new A();

            DeepCopy deepClone = dc.Clone() as DeepCopy;
            DeepCopy shadowClone = dc.MemberwiseClone() as DeepCopy;

            // 深复制的目标对象将拥有自己的引用类型成员对象
            deepClone.a.message = "我是深复制的A";
            Console.WriteLine(dc);
            Console.WriteLine(deepClone);
            Console.WriteLine();
            // 浅复制的目标对象将和原始对象共享引用类型成员对象
            shadowClone.a.message = "我是浅复制的A";
            Console.WriteLine(dc);
            Console.WriteLine(shadowClone);

            Console.ReadKey();
        }
    }

执行结果

三.如何实现深复制

1.逐个复制

2.序列化实现深复制

    [Serializable]
    public class DeepCopy : ICloneable
    {
        ......

        public object Clone()
        {
            // 实现深复制-方式1:依次赋值和实例化
            //DeepCopy newObj = new DeepCopy();
            //newObj.a = new A();
            //newObj.a.message = this.a.message;
            //newObj.i = this.i;

            //return newObj;
            // 实现深复制-方式2:序列化/反序列化
            BinaryFormatter bf = new BinaryFormatter(); 
            MemoryStream ms = new MemoryStream(); 
            bf.Serialize(ms, this); 
            ms.Position = 0; 
            return bf.Deserialize(ms);
        }

        ......
    }
    [Serializable]
    public class A
    {
        public string message = "我是原始A";
    }

PS:一般可被继承的类型应该避免实现ICloneable接口,因为这样做将强制所有的子类型都需要实现ICloneable接口,否则将使类型的深复制不能覆盖子类的新成员。


复习一下基础知识。

  • 17
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
当然,下面是一些常见C#WPF面试题和答案: 1. 什么是C#C#是一种面向对象的编程语言,由微软公司开发。它是.NET平台的一部分,用于开发各种应用程序,包括桌面应用程序、Web应用程序、移动应用程序等。 2. C#中的值类型和引用类型有什么区别? 值类型直接包含其数据,存储在堆栈上,而引用类型存储在堆上,并且变量存储的是对数据的引用。值类型的赋值是将值进行复制,而引用类型的赋值是将引用进行复制。 3. C#中的接口和抽象类有什么区别? 接口是一种完全抽象的类,它定义了一组方法和属性,但没有实现。它被用于实现多态性和类之间的松耦合。抽象类是一个可以包含实现代码的类,它可以有抽象成员和非抽象成员。一个类只能继承一个抽象类,但可以实现多个接口。 4. 什么是WPFWPF(Windows Presentation Foundation)是微软公司开发的一种用于创建用户界面的技术。它使用XAML(eXtensible Application Markup Language)来定义界面,提供了强大的UI布局和数据绑定功能。 5. WPF中的MVVM模式是什么? MVVM(Model-View-ViewModel)是一种设计模式,用于在WPF应用程序中实现分离UI逻辑和业务逻辑。模型(Model)表示应用程序的数据,视图(View)表示用户界面,视图模型(ViewModel)是视图和模型之间的中介,负责处理用户输入、数据绑定和其他逻辑。 6. WPF中的数据绑定有哪些方式? WPF中的数据绑定有多种方式,包括: - 单向绑定:将数据从源绑定到目标,只能源更新目标。 - 双向绑定:将数据从源绑定到目标,并且可以在目标或源上进行更改。 - 单向到源绑定:将数据从目标绑定到源,只能目标更新源。 7. WPF中的命令是什么? 命令是一种用于处理用户交互的行为的机制。WPF中的命令实现了ICommand接口,可以通过命令来处理按钮点击、菜单项选择等操作。 这些问题只是一些常见C#WPF面试题,您可能会遇到更具体的问题,所以建议您对这些主题进行更详细的学习和准备。希望对您有所帮助!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值