(C#)如何按值类型而不是引用类型复制类?
以下面的代码为例:(C#)如何按值类型而不是引用类型复制类?,c#,class,unity3d,reference-type,C#,Class,Unity3d,Reference Type,以下面的代码为例: using System.Collections; using System.Collections.Generic; using UnityEngine; public class MyClass { public int myNumber; } public class Test : MonoBehaviour { MyClass class1 = new MyClass(); MyClass class2 = new MyClass();
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class MyClass
{
public int myNumber;
}
public class Test : MonoBehaviour
{
MyClass class1 = new MyClass();
MyClass class2 = new MyClass();
void Start()
{
class1.myNumber = 1;
class2 = class1;
class2.myNumber = 2;
Debug.Log(class1.myNumber); //output: 2 (I'd want it to output 1!!!)
}
}
现在,如果我理解正确的话,在C#中,类是引用类型而不是值类型,因此需要这种行为。然而,我需要做些什么才能不这样做呢?如果不将两个类“链接”在一起,我可以做什么来进行正常的值赋值 我意识到我可以用以下内容替换第18行:
class2.myNumber = class1.myNumber;
它可以做我想做的事情(因为我分配的是值类型而不是引用类型),但对我的情况来说有点不方便。。。在我的真实脚本中,这个类有几个子元素,我需要在许多不同的地方复制它们
是否有一种单行方法可以将一个类复制到一个新类,而不通过引用原始类链接,而是通过创建一个新的独立类?C#有一种称为Struct的东西,它基本上是一个值类型类的轻量级版本。如果您特别需要值类型,您可能希望使用结构而不是类
主要区别在于结构不需要使用“新”赋值进行实例化,它们不能从另一个结构或类继承,也不能用作另一个类的基础。根据需要执行深度或浅层复制。 这个怎么样
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class MyClass
{
public int myNumber;
}
public class Test : MonoBehaviour
{
MyClass class1 = new MyClass();
MyClass class2 = new MyClass();
private void Start()
{
class1.myNumber = 1;
class2 = GetClassCopy(class1);
class2.myNumber = 2;
Debug.Log(class1.myNumber); // output:1
}
private MyClass GetClassCopy(MyClass source)
{
MyClass result = new MyClass();
result.myNumber = source.myNumber;
return result;
}
}
使用
struct
可以接受吗?我对C不太熟悉,但它很像Java。所以它被称为深度复制或克隆。你可以查一下。快速而肮脏的方法是序列化为json,然后返回到类实例。@rhughs这很有趣。一个班级有什么不同?除了作为值类型而不是引用类型之外,它的行为是否相同?如果不使用深度复制,基本上就是指向引用类型(也称内存地址)的同一实例。因此,如果更改其中一个的值,则会更改另一个的值。深度复制可以防止这种情况发生。另一种方法称为浅复制。结构仍然可以具有引用类型属性,因此仅使用结构并不是全部答案。@Crowcoder您能在此基础上展开一点吗?哪些属性仍然具有引用类型?@Francesco他说的是,更改为结构并不是一个通用的解决方案。如果结构持有对可变引用类型对象的引用,那么该对象中的更改将被给定值类型的所有副本“看到”,与具有逐值复制语义的结构无关。类和结构在.Net中的行为方式存在显著差异。将类型更改为struct只是为了避免.Net处理引用和值类型的方式,这不是一个好的设计决策。在走这条路之前,确保你完全理解你正在做的权衡。开始阅读并继续阅读有关StackOverflow的几个常见C#class vs struct问题。谢谢@jiveturkey,我接受了你的答案,因为这是正确的答案,事实上在示例脚本中它是有效的。但出于对一切神圣事物的热爱,在我的主要剧本中,它不是!我会继续研究,但我会朝这个方向走。为了确保,如果我的类只有string、int和int[]类型,我可以简单地使用ShallowCopy吗?我相信这就是您想要的。但要仔细检查字符串。它可能是一个对象而不是基类型。我想我发现了我的问题。显然,数组是引用类型。我正在尝试重新适应DeepCopy方法,看看是否可以将其与这些方法相匹配。