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

关于类中值类型属性的困惑:为何Int32属性可修改而结构体不行?

类中值类型属性的修改差异解析

核心差异在于直接给属性赋值和修改值类型实例自身内容的本质区别,下面拆解两段代码的执行逻辑:

1. test.SetX(10)能生效的原因

SetX方法内部的X = x是调用属性的setter,直接对Test实例中存储的Int32值进行覆盖。这个过程没有调用X属性的getter,不存在值类型副本的问题——本质是把新的Int32值(10)写入Test对象对应属性的内存位置,自然能修改原对象的属性值。

2. test.Point.Set(20,30)无效的原因

执行test.Point时,调用的是Point属性的getter,由于Point是值类型,getter会返回原存储值的副本。后续对这个副本调用Set方法,只是修改了副本的X、Y字段,完全不会影响Test实例中原本存储的Point值。

如果要让Point的修改生效,需要先获取副本、修改后再赋值回属性(调用setter写入原存储):

var tempPoint = test.Point;
tempPoint.Set(20, 30);
test.Point = tempPoint;

总结

  • 对于值类型属性:
    • 直接用=赋值时,调用setter修改原对象的存储值,有效。
    • 调用值类型的方法/修改其字段时,若直接通过属性调用(test.Point.Set(...)),修改的是getter返回的副本,原对象不受影响;必须先获取副本修改,再赋值回属性才会生效。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 20:50:01