主构造函数类中属性初始化的CS9124警告原因咨询
CS9124警告的具体原因解析
先看触发警告的代码:
public sealed class C(int a) { public int A { get; } = a; //<--此处触发警告 public int Sum(int b) { return a + b; } }
警告内容:
warning CS9124: Parameter 'int a' is captured into the state of the enclosing type and its value is also used to initialize a field, property, or event.
警告的核心原因
这个警告是编译器提示你存在冗余内存存储:
- 当你在类的成员方法(比如
Sum)里直接使用主构造函数的参数a时,C#编译器会自动生成一个私有隐式字段,专门用来保存a的值,供后续方法调用时读取。 - 同时你用
a初始化了只读属性A,A本身也会有一个后备字段存储a的值。 - 这就导致同一个
a的值被重复存储了两次:一次是编译器生成的隐式字段,一次是A的后备字段,造成了不必要的内存浪费。
为什么去掉a的方法引用后警告消失?
看修改后的代码:
public sealed class C(int a) { public int A { get; } = a; public int Sum(int b) { return b; //<--不再使用a } }
因为你不再在Sum方法里引用a,编译器就不会生成那个用来保存a的隐式字段了——整个类里只有A的后备字段存储a的值,没有冗余存储,所以警告自然消失。
补充纠正
你猜测的“类中对a的修改不会改变A属性”并不准确,因为主构造函数参数被捕获为隐式字段后,这个字段是只读的,你根本无法在构造完成后修改a的值。警告的核心是冗余存储,而非可变性问题。
内容的提问来源于stack exchange,提问作者Mario Vernari
相关产品推荐
相关产品推荐

