C#中构造函数赋值时能否触发属性setter的条件校验逻辑?
问题根因
你在Car类的构造函数中直接对私有后备字段mycost赋值,完全绕开了cost属性的set访问器,自然不会触发你写在set块里的价格判断逻辑。
C#中属性和其底层私有字段是两个完全独立的成员:
- 你定义的
cost是对外暴露的属性,本质上封装了get/set两个方法块,只有显式对cost属性赋值时,才会执行set块里的校验、输出逻辑。 mycost是cost属性对应的私有存储字段,直接对它赋值是直接修改内存中的字段值,不会经过属性的任何附加逻辑。
你当前的构造函数实现如下:
public Car(int cost) { this.mycost = cost; // 直接操作私有字段,跳过属性set逻辑 }
这就导致传入7000调用构造函数时,mycost被直接设为7000,既没有触发大于5000的分支判断,也不会输出"too expensive",最终读取car.cost时拿到的就是直接赋值的7000。只有后续显式执行car.cost = 7000对属性赋值时,才会真正进入set块的逻辑。
修复方案
将构造函数中的赋值目标从私有字段mycost改为cost属性本身,这样构造阶段赋值和后续外部赋值都会复用同一套校验逻辑:
public Car(int cost) { this.cost = cost; // 显式调用属性setter,触发校验逻辑 }
修改后实例化new Car(7000)时就会直接输出"too expensive",同时cost属性值会按逻辑被设为0,符合预期。
注意:不要默认构造函数中同名参数的赋值会自动走属性逻辑,只要赋值目标是私有字段,就会完全绕开属性封装的逻辑。如果需要复用属性中的校验、副作用逻辑,必须显式对属性赋值。
内容的提问来源于stack exchange,提问作者Jr. dective
相关产品推荐
相关产品推荐

