(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;
}
}
取下面的代码:
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;
}
}