(C#) 如何按值类型而不是引用类型复制 类?

(C#) How to copy classes by value type and not 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();

    void Start()
    {
        class1.myNumber = 1;
        class2 = class1;
        class2.myNumber = 2;

        Debug.Log(class1.myNumber); //output: 2 (I'd want it to output 1!!!)
    }
}

现在,如果我理解正确的话,在 C# 中 classes 是引用类型而不是值类型,因此需要这种行为。
但是,我需要做什么才能不这样做呢?如果 "linking" 两个 class 不在一起,我该怎么做才能进行正常的赋值?

我意识到我可以用这个替换第 18 行:

class2.myNumber = class1.myNumber;

它会做我想做的事(因为我分配的是值类型而不是引用类型),但这对我的情况有点不方便......在我的真实脚本中 class 有几个我需要在许多不同的地方复制的子元素。

是否有一种单行方法可以将一个 class 复制到一个新的,而不是通过引用链接到原始的,而是通过创建一个新的独立的 class?

C# 有一种叫做 Struct 的东西,它基本上是 Class 的轻量级版本,它是一种值类型。如果你特别需要一个值类型,你可能想使用 Structs 而不是 Classes。

主要区别是结构不需要使用 "New" 赋值来实例化,它们不能从另一个结构或 Class 继承,它们不能用作另一个 [=15] 的基础=].

根据需要执行深拷贝或浅拷贝。 https://docs.microsoft.com/en-us/dotnet/api/system.object.memberwiseclone?view=netframework-4.8

这个怎么样?

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;
    }
}