You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#对象的get属性返回引用还是值?代码示例相关疑问

C#中属性getter返回引用还是副本?

嘿,这个问题的核心其实取决于你的Position属性对应的类型是值类型还是引用类型,咱们结合你的代码来唠明白~

先看你的场景:值类型的情况

你代码里的Vector2是Unity中的结构体(struct),属于值类型。对于值类型来说,当你调用属性的get方法时,返回的是该值的完整副本——也就是说,你第一行代码Vector2 position = Position;其实是把Position当前的值复制了一份到局部变量position里,这俩是完全独立的实例,修改其中一个不会影响另一个。

所以你前两行修改position.x和position.y的时候,只是在改那个局部副本的数值,根本碰不到基类里的Position属性。这就是为什么必须加第4行Position = position;,把修改后的副本赋值回Position,才能让基类的属性真正更新。

再说说引用类型的情况

如果你的Position属性是引用类型(比如自定义的class),那情况就不一样了:属性的get方法返回的是对象的引用(也就是指向内存中对象的“指针”)。这时候你直接修改返回对象的成员变量,会直接作用于原属性指向的那个对象,不需要再把变量赋值回去。举个例子:

// 自定义一个引用类型的向量类
public class CustomVector 
{
    public float x;
    public float y;
}

// 假设Position是这个引用类型的属性
public CustomVector Position { get; set; }

// 这时候直接修改成员就生效,不需要重新赋值
Position.x = Mathf.Clamp(Position.x, 0, mScreenSize.x);
Position.y = Mathf.Clamp(Position.y, 0, mScreenSize.y);

总结一下

  • 当属性类型是值类型(struct、int、float等):getter返回副本,修改副本不影响原属性,必须重新赋值才能生效;
  • 当属性类型是引用类型(class、数组等):getter返回对象引用,修改引用指向的对象成员会直接影响原属性。

内容的提问来源于stack exchange,提问作者Joe

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 09:31:36