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
相关产品推荐
相关产品推荐

