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



我是一名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;
}

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

因为Vector3struct,而不是class。这使它成为一种值类型(与引用类型相反(。例如类似于int

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

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

void setVector3(ref Vector3 v)

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

如果传入引用类型(定义为class(,则默认情况下会观察到预期的行为。该对象将存在于堆上,并且在整个堆栈中是相同的对象引用。

最新更新