(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方法,看看是否可以将其与这些方法相匹配。