服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C# - C#中Clone一个对象的值到另一个对象案例

C#中Clone一个对象的值到另一个对象案例

2022-10-21 13:06这名字不好听 C#

这篇文章主要介绍了C#中Clone一个对象的值到另一个对象案例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

我也只是略懂皮毛,自己记录下方便以后看的,各位有任何高见烦请留言,谢谢,抱拳!

想只复制值需要你的类实现ICloneable接口,并实现public object Clone()方法,其中

?
1
2
3
4
5
{
return this as object; //引用同一个对象
return this.MemberwiseClone(); //浅复制
return new DrawBase() as object;//深复制
}

引用

即相当于用等号(=)赋值,相当于 this,引用,两者共用一套数据

深复制

新建对象,需手动赋值,所有数据新建,两个对象完全无关

浅复制

只复制值而不要引用,但只作用于基础类型(int,float,string也好使),对于引用类型(如自建类)不生效。如果只想要值,可在自建类里也是用这种办法,如a.t = T.Clone() as T; 最后将a返回,即可解决这个问题。

本次主谈浅复制,如有形如:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
class a : ICloneable
{
 public int i;
 public string str;
 public b ins;
 
 public object Clone()
 {
 return this.MemberwiseClone(); //浅复制
 }
}
class b
{
 public int bi;
}
 --------------Program--------------
 Main :
 {
 a t1 = new a();
 t1.i = 1;
 t1.str = "str1";
 t1.ins = new t1();
 t1.ins.bi = 111;
 
 a t2 = t1.Clone() as a;
 print(t1.i + " " + t2.i);
 print(t1.str + " " + t2.str );
 print(t1.ins.bi + " " + t2.ins.bi);
 
 t2.i = 2;
 t2.str = "str2";
 t2.ins.bi = 222;
 print(t1.i + " " + t2.i);
 print(t1.str + " " + t2.str );
 print(t1.ins.bi + " " + t2.ins.bi);
}

首先这段代码实际上是不会运行的,因为浅复制不会复制引用,也就是在print(t2.ins.bi)时,实际上t2.ins是空,但t2.i和t2.str是有值的,而且在后续对t2.i和t2.str进行改动时并不会影响到t1的值,这一部分的结果使我们想要的。

但实际上类里有属性是引用是难以避免甚至是很常见的,这种情况我们只需要在类b中也实现ICloneable接口并实现

?
1
2
3
4
public object Clone()
{
 return this.MemberwiseClone(); //浅复制
}

同时修改类a中的Clone方法为:

?
1
2
3
4
5
6
public object Clone()
{
 a T = this.MemberwiseClone() as a; //浅复制
 T.ins = ins.Clone() as b;
 return T;
}

由此,t2将获取到t1的所有值,且对t2修改时,并不会影响到t1。

补充知识:C++中实现对象的clone()

在C#中,许多对象自动实现了clone函数,在C++中,要拷贝一个对象,除了自定义一个拷贝构造函数来实现对象复制外,还可以像C#中那样实现一个clone函数,这需要借助编译器实现的一个隐藏拷贝构造函数,这样的做法,更省心。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include "stdafx.h"
#include <iostream>
 
class CA
{
public:
 int value;
 CA* clone() const { return new CA( *this );}
 //仅一个构造函数
 CA(int a ){value=a;}
};
 
int _tmain(int argc, _TCHAR* argv[])
{
 CA* objA=new CA(10);
 CA* objtemp=objA->clone();
 delete objA;
 std::cout<<objtemp->value;
 delete objtemp;
 return 0;
}

以上这篇C#中Clone一个对象的值到另一个对象案例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持服务器之家。

原文链接:https://blog.csdn.net/weixin_41957078/article/details/84667681

延伸 · 阅读

精彩推荐
  • C#C#读取XML的CDATA节点内容实例详解

    C#读取XML的CDATA节点内容实例详解

    在本篇文章里小编给大家整理了关于C# 读取XML的CDATA节点内容的相关知识点内容,有需要的朋友们参考学习下。...

    需要充电8672022-08-05
  • C#C# Rx的主要接口深入理解

    C# Rx的主要接口深入理解

    这篇文章主要介绍了C# Rx的主要接口深入理解的相关资料,需要的朋友可以参考下...

    aofengdaxia8362021-12-28
  • C#c#字符串编码问题的处理解决

    c#字符串编码问题的处理解决

    这篇文章主要介绍了c#字符串编码问题的处理解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下...

    森大科技6772022-08-16
  • C#C#调用摄像头实现拍照功能的示例代码

    C#调用摄像头实现拍照功能的示例代码

    这篇文章主要介绍了C#调用摄像头实现拍照功能的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的...

    svq186567322022-10-10
  • C#C#中event内存泄漏总结

    C#中event内存泄漏总结

    本篇文章给大家分享了在C#中event内存泄漏的相关知识点以及代码分享,有兴趣的朋友参考学习下。...

    jazzpop4632022-02-22
  • C#winform dateTime数据类型转换方法

    winform dateTime数据类型转换方法

    这篇文章主要介绍了winform dateTime数据类型转换方法,需要的朋友可以参考下...

    zhaozhimao9312021-12-24
  • C#C#如何连接服务器共享文件夹

    C#如何连接服务器共享文件夹

    这篇文章主要为大家详细介绍了C#如何连接服务器共享文件夹,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    某些人4232022-02-24
  • C#C#中常用的正则表达式

    C#中常用的正则表达式

    本文主要介绍了C#中常用的正则表达式。具有一定的参考价值,下面跟着小编一起来看下吧...

    蒙小米12012021-12-18