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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 21:48:09