【问题标题】:C# base misuse?C# 基础滥用?
【发布时间】:2021-09-22 08:15:26
【问题描述】:

我经常在公司发现这种代码...

class Base
{
    public int Property
    {
        get; set;
    }
}

class Derived : Base
{
    public Derived()
    {
        base.Property = 0xAFFE;
    }
}

而且,我经常认为这种对 base 的使用是“错误的”。

我认为,“this.Property”将是“正确的”(或简称为“Property = 0xAFFE;”)

我认为,可以重构(使 Property 虚拟化,覆盖它)。

但是,我的论点似乎没有说服力。你能帮忙争论吗?还是我(完全)错了?

谢谢。

【问题讨论】:

  • 如果您想要基于“错误”或“正确”的答案,您可能会在softwareengineering.stackexchange.comcodereview.stackexchange.com 找到更好的结果
  • 对于 SO 来说可能过于基于意见,但至少您应该知道在构造函数中设置虚拟属性是有问题的:stackoverflow.com/questions/28382191/…
  • 我的观点是基类大部分时间都是错误的。
  • 使用 this & base 之间存在语义差异,所以我不认为这是一个自以为是的问题。
  • 我真正发现错误的是没有使用基构造函数来设置基类的属性。他们可能正在使用 base.Property,因为您可以使用“new”关键字创建另一个具有相同名称的属性。

标签: c# base


【解决方案1】:

我认为,如果您的示例中的Property 不是virtual,那么您使用base 还是this 都没有关系。 如果它是virtual,并且在继承的类中被覆盖,那么您的行为就会有所不同。

我个人倾向于在设置这样的属性时从不使用basethis(这与指定this 相同)。只有在特定情况下(例如覆盖虚拟方法和调用基本实现)我才使用这些关键字

【讨论】:

  • true,只要它不是虚拟的(并且没有发生重构)都没关系......开发人员只想明确“显示”,实现在基类中(但是为什么?),但是例如在 DerivedDerived 类(派生自 Derived)(s)的 ctor 或函数中,他会再次编写 base(但现在 s(he) 实际上想说的是 base.base)
  • @AnnemarieS。 “他的开发人员只是想明确地“显示”,实现在基类中(但为什么?)” 我同意你的看法。我要在这里补充的是,如果需要明确区分这是 not 当前(派生)类的一部分,这可能表明他们应该使用组合而不是继承,因为这使得两个类之间的界限变得明确,而继承有意混淆了这些行。
  • I think that, if Property in your example is not virtual, it doesn't matter if you use base or this. 您可能想了解阴影。
【解决方案2】:

所以,我们至少有 3 种方式来表达相同的意思:

Property = 0xAFFE;
this.Property = 0xAFFE;
base.Property = 0xAFFE;

和往常一样,有一些小方面可以决定这条线的正确或错误。

第一个版本最轻松。属性可以是真实属性或上面声明的变量,也可以是从外部范围传递的参数。此外,在某些情况下,您可以编写 Property = Property,编译器会很聪明地理解您(无论如何都是不好的做法)。

第二个版本做了一个假设:财产是阶级的财产。时期。尽管某些代码分析器会提示“可以简化语法”,但这是一种正常的处理方式。

第三个意图更严格的假设:财产是祖先的祝福。因此,即使您在本地覆盖它,该语法 100% 也能确保您将更改应用于祖先字段。

说实话,在大多数情况下,最后两种语法形式是可以互换的。你真的认为强制执行你的观点有必要吗?

【讨论】:

  • Second version does an assumption: Property is the class belongings. Period. Despite some code analyzers would rise a hint "syntax can be simplified", this is a normal way of doing things. 第一个和第二个版本100%相同。他们将永远有相同的结果。
  • 重构后,可以引入同名的 var 并重命名属性本身(在此处添加分支合并等内容)。不幸的是,第一个版本不会破坏这种情况下的编译,只是默默地滚动到另一个轨道。
  • 奇怪的是有一个带有这种大小写的变量,但可以肯定。
猜你喜欢
  • 2018-03-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-02
  • 2010-11-13
  • 2016-04-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多