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

3

我是一名Java开发人员,Java采用的是传值调用方式,但我们可以在方法中更改对象的属性。我无法很好地解释这个问题,但这里有一个链接:如果Java是按值传递的,为什么我们可以在方法中更改对象的属性? 我也使用C#在Unity中开发游戏,我想知道上述情况是否也适用于C#语言。我尝试了一下,并且是有效的,和Java相同。在尝试时,我自己定义了一个类并尝试更改其属性。然后,我尝试了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属性可以像这样设置,这不是问题)?


3
请阅读:为什么询问问题时不能上传代码/错误的图片? --- 请阅读:我能在一篇帖子中只问一个问题吗? --- 这个问题与Java有何关联? - Turing85
1个回答

7
因为Vector3struct,而不是class,这使它成为值类型(与引用类型相对)。例如,与int类似。
因此,在您的setVector3方法中,您修改了仅限于该方法的本地Vector3对象的副本。
您可以显式通过引用传递它:
void setVector3(ref Vector3 v)

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接