C#中float属性为何同步另一float值而非保存独立值?
问题原因分析
float属于值类型,OriginalValue = obj.Value 语句执行时,会将当前obj.Value的数值复制一份赋值给OriginalValue,正常逻辑下二者后续修改不会自动同步,你遇到的问题可从以下几个方向排查:
- 最常见诱因:你贴出的是简化代码片段,实际项目中
OriginalValue没有使用自动属性,而是自定义getter直接返回MyObject实例的Value,比如写法为public float OriginalValue => GetObject().Value;,这种情况每次读取OriginalValue都会实时拉取MyObject的最新值,自然会和MyObject.Value始终一致。 - 逻辑顺序错误:存在其他业务逻辑/线程在
OriginalValue = obj.Value执行前就修改了obj.Value,或是在你读取OriginalValue前有其他代码重写了OriginalValue的赋值。 - 并发执行问题:多线程场景下
UpdateValue被重复并发调用,导致赋值顺序混乱。 - 类型定义错误:误将
MyObject定义为结构体(值类型),GetObject()每次返回的是实例副本,你修改的对象和你后续校验的对象不是同一个实例,造成OriginalValue被同步修改的错觉。
修复方案
- 修正
OriginalValue的属性定义,确保它使用自动存储的 backing field,不要在getter中实时读取MyObject的数值,正确定义如下:
public float OriginalValue { private set; get; }
- 检查
UpdateValue方法的调用链路,确保没有在MyClass.Value的setter、MyObject.Value的setter中递归调用UpdateValue打乱赋值顺序。 - 如果是多线程场景,给
UpdateValue加锁保证执行的原子性,避免并发调用导致的赋值错乱:
private readonly object _lockObj = new object(); public override void UpdateValue() { lock(_lockObj) { MyObject obj = GetObject(); OriginalValue = obj.Value; obj.SetValue(this.Value); } }
内容的提问来源于stack exchange,提问作者Cacangale
相关产品推荐
相关产品推荐

