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

为何赋值语句一致的两段C#代码表现不同?类与结构体差异解析

为什么C#中这段引用类型和值类型的赋值代码行为不同?

先看你给出的代码:

private string? p1;
public string P1 => p1 ?? (p1 = "");

private int? p2;
public int P2 => p2 ?? (p2 = 1);

造成两者行为差异的核心原因,大概率是这段代码所在的类型是值类型(struct)而非引用类型(class),具体区别如下:

  • 针对string(引用类型)的字段p1:
    不管代码在class还是struct里,只要你操作的是同一个实例的引用(class场景),或者没有触发struct的副本创建(比如用ref传递实例),第一次访问P1时,p1为null,会执行p1 = ""给字段赋值;后续再访问P1,p1已经有值,直接返回结果,不会重复赋值。

  • 针对int?(可空值类型,本质是Nullable<int>结构体)的字段p2:

    • 如果代码在class中:行为和p1完全一致,第一次访问P2时给p2赋值1,后续直接返回已赋值的结果,不会重复执行赋值逻辑。
    • 如果代码在struct中:struct是值类型,默认情况下每次访问结构体的属性,都会创建一份结构体的副本。第一次访问P2时,你修改的是副本的p2字段,原实例的p2依然是null;后续每次访问P2,都会生成新的副本,副本的p2还是null,导致每次都会执行p2 = 1的赋值,看起来字段值始终没被保留,每次都返回初始赋值的1。

如果这段代码确实在class中,那两者的行为应该完全一致,出现差异大概率是有其他代码修改了p2字段,或者你的测试逻辑存在问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 10:55:59