我是一名Java开发人员,Java是按值传递的,但我们在方法中更改对象的属性.我无法很好地解释,但这里有一个链接: If Java is pass-by-value, then why can we change the properties of objects in methods?个 我也在用C#开发Unity中的游戏.我想知道,在C#语言中,上述情况也可以适用.我试过了,是的,它是有效的,它是一样的.在try 的同时,我自己定义了一个类,并try 更改其属性.在那之后,我try 了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属性可以这样设置,这不是问题)?

推荐答案

因为Vector3 is a struct,不是class.这使得它成为值类型(而不是引用类型).例如,类似于int.

因此,在您的setVector3方法中,您修改的是Vector3对象中的copy对象,该对象仅对该方法是本地的.

您可以显式地pass it by reference:

void setVector3(ref Vector3 v)

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

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

Csharp相关问答推荐

如何使用C#和Graph API从Azure Directory获取用户详细信息

如何使用C#中的图形API更新用户配置文件图像

为什么我的ASP.NET核心MVC应用程序要为HTML元素添加一些标识符?

try 在Blazor项目中生成html

选取器与.NET Maui MVVM的绑定属性

自动映射程序在GroupBy之后使用项目

获取具有AutoFaces的所有IOptions对象的集合

使用预定义对象减少Task.Run/Factory.StartNew中的关闭开销

当前的文化决定了错误的文化

取决于您的数据量的多个嵌套循环

如何在CSharp中将json字符串转换为DataTable?

Google OAuth令牌交换在.Net中不起作用

是否可以在Entity Framework Core中使用只读 struct 作为拥有实体?

.NET Google Workspace API获取错误CS0266

毛伊岛.NET 8图片不再适合按钮

在.NET Maui中,Flyoutindow/Hamburger菜单可以在shell 之外实现吗?

try 访问字典中的模拟对象时引发KeyNotFoundException

如何为控制器PUT操作绑定对象数组

如何对构建在Clean架构和CQRS之上的控制器进行单元测试?

我是否以错误的方式使用了异步延迟初始化?