虽然我可以在方法中更改自定义对象的属性,但无法更改 Vector3(Unity、C#)的属性

Ahm*_*DIZ 3 c# oop unity-game-engine

我是一名 Java 开发人员,Java 是按值传递的,但我们在方法中更改对象的属性。我无法很好地解释它,但这里有一个链接: 如果Java是按值传递的,那么为什么我们可以在方法中更改对象的属性? 我还在 Unity 中使用 C# 开发游戏。我想知道上面的情况在C#语言中也同样有效。我试过了,是的,它是有效的,而且是一样的。在尝试的过程中,我自己定义了一个类并尝试改变它的属性。之后我尝试使用Vector3,但没有成功。

void Start()
{
    Vector3 v = new Vector3(0,0,0);
    setVector3(v);
    Debug.Log(v);
}

void setVector3(Vector3 v)
{
    v.x = 5;
}
Run Code Online (Sandbox Code Playgroud)

虽然我们可以在C#中的方法中更改对象的属性,但为什么我不能更改Vector3的x属性(x属性可以这样设置,这不是问题)?

Dav*_*vid 7

因为Vector3 是astruct,不是a class。这使得它成为值类型(而不是引用类型)。类似于一个int例子。

因此,在您的setVector3方法中,您正在修改仅该方法本地的对象的副本。Vector3

您可以通过引用显式传递它

void setVector3(ref Vector3 v)
Run Code Online (Sandbox Code Playgroud)

这将告诉编译器在方法框架中使用与调用框架中使用的相同的值类型实例。

如果您传入引用类型(定义为 a 的东西class),那么默认情况下您将观察到您期望的行为。该对象将存在于堆上,并且在整个堆栈中都是相同的对象引用。