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

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被同步修改的错觉。
修复方案
  1. 修正OriginalValue的属性定义,确保它使用自动存储的 backing field,不要在getter中实时读取MyObject的数值,正确定义如下:
public float OriginalValue { private set; get; }
  1. 检查UpdateValue方法的调用链路,确保没有在MyClass.Value的setter、MyObject.Value的setter中递归调用UpdateValue打乱赋值顺序。
  2. 如果是多线程场景,给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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.15 20:54:03