C#构造函数内属性赋值与属性初始化器直接赋值的差异
C#两种自动属性赋值写法的差异
首先明确第二种写法的正式名称:直接在自动属性定义后赋值的语法叫做 自动属性初始化器(Auto-Property Initializers),是C# 6正式推出的语言特性。
两种写法在你给出的仅有无参构造、调用无参构造实例化的场景下,运行结果完全一致,核心差异体现在以下几点:
- 执行时机与多构造函数场景表现不同
自动属性初始化器的赋值逻辑会在当前类任意构造函数的代码执行前自动运行。如果类存在多个重载构造函数,你不需要在每个构造函数里重复给属性赋相同的初始值,初始化器会统一完成赋值。
写在无参构造函数内的赋值,仅当调用无参构造创建实例时才会执行。如果其他重载构造函数没有通过:this()链式调用无参构造,这部分赋值逻辑就不会触发,属性会保留类型默认值(比如string类型默认是null)。 - 灵活性不同
自动属性初始化器只能赋值在实例创建阶段就能确定的固定值,无法根据构造函数传入的参数、实例其他成员的状态动态计算属性初始值。
构造函数内赋值没有这个限制,可以根据上下文动态计算赋值内容。 - 只读属性支持的便捷性不同
自动属性初始化器可以直接为无set访问器的只读自动属性赋初始值,赋值完成后属性值在整个实例生命周期内不可修改,不需要额外在构造函数中重复写赋值逻辑。构造函数内虽然也能给只读属性赋值,但多构造场景下需要重复编写赋值代码。
举个多构造场景下的差异示例:
// 自动属性初始化器写法 public class MyClass { public MyClass(){} public MyClass(int testParam) { // 不需要额外赋值,实例化后MyProperty默认就是"value" } public string MyProperty { get; set; } = "value"; }
// 构造函数内赋值写法 public class MyClass { public MyClass(){ MyProperty = "value"; } public MyClass(int testParam) { // 这里没有链式调用无参构造,也没有单独赋值的话,MyProperty会是null } public string MyProperty { get; set; } }
内容的提问来源于stack exchange,提问作者SeReGa
相关产品推荐
相关产品推荐

