C# 派生类构造用base为父类非虚Property赋值是否属于误用?
结论
你的观点是合理的,当前代码中base.Property的使用不属于语法错误,但属于非必要的冗余调用,确实存在可维护性隐患,应该优先使用this.Property或直接写Property赋值。
核心佐证论据
1. 违背base关键字的设计初衷
base的设计定位是仅当你需要显式绕开派生类的重写逻辑、调用基类版本的成员时才使用。在当前场景下基类Property未被重写,base.Property和this.Property的运行行为完全一致,此时使用base属于多余操作,还会误导后续维护者,让其他人误以为该属性存在派生类重写版本,当前代码是刻意要调用基类实现。
2. 未来迭代的兼容性风险确实存在
你提到的虚属性修改场景是非常典型的隐蔽bug来源,参考以下迭代后的代码:
class Base { // 后续迭代改为虚属性 public virtual int Property { get; set; } } class Derived : Base { // 派生类新增重写逻辑,比如加业务校验 public override int Property { get => base.Property; set { if (value < 0) throw new ArgumentOutOfRangeException(nameof(value)); base.Property = value; } } public Derived() { // 原有base调用直接绕过了新增的校验逻辑,业务规则被破坏 base.Property = 0xAFFE; } }
这种bug排查成本极高,修改属性为virtual的开发者很难想到构造函数中还存在一个base调用绕开了重写逻辑。
3. 不符合通用C#编码规范
微软官方C#编码指南明确约定:无特殊需求时直接访问继承的成员即可,仅在需要调用被重写的基类成员时才使用base关键字。多余的base调用属于冗余代码,会降低代码可读性。
例外场景
如果当前代码确实是刻意要绕开未来可能新增的派生类重写逻辑,那可以保留base调用,但必须添加清晰的注释说明刻意使用base的原因,否则都应该替换为普通的属性访问写法。
内容的提问来源于stack exchange,提问作者user16973256
相关产品推荐
相关产品推荐

