【问题标题】:Why can't I access the Backing Field on an auto implemented property from within an inherited class为什么我不能从继承的类中访问自动实现的属性的支持字段
【发布时间】:2011-12-20 15:10:54
【问题描述】:

我有一个公开自动实现属性Enabled的类

Public MustInherit Class TopLevel
    Protected Property Enabled() As Boolean
End Class

在继承的类中我无法访问 _Enabled

Public Class SubClass
    Inherits TopLevel

    Public Function Foo() As string
        If Not _Enabled Then Return Nothing '<- This fails
    End SUb
End Class

但如果我没有使用自动实现的属性并声明我自己的支持字段如下,则可以从子类访问:

Private _Enabled as Boolean

---- 编辑 ---- abve 行不正确 - 这是不可能的,实际上是 Protected 在允许从子类访问的原始代码中查看 @JonSkeet 答案 ---- 编辑----

当然,我可以从子类中访问 Enabled 来解决这个问题,但是有人可以解释为什么会出现这种行为吗?

【问题讨论】:

  • "这可以从子类访问:" 可以从子类访问的私有字段对我来说当然听起来很奇怪。在 C# 中这是不可能的。不确定 VB.net,但如果它允许这样做,我会感到惊讶。

标签: .net vb.net oop class inheritance


【解决方案1】:

但如果我没有使用自动实现的属性并声明我自己的支持字段如下,则可以从子类访问:

Private _Enabled as Boolean

不,它不会 - 无法从派生类访问私有字段 - 只有 受保护的 可以访问。 (嵌套类除外,它们可以访问其包含类的私有成员。)

来自docs for the Private modifier

指定一个或多个已声明的编程元素只能从其声明上下文中访问,包括从任何包含的类型中访问。

我个人认为直接访问自动实现的属性的支持字段是不好的形式 - 在 C# 中,它甚至不可用,因为它被赋予了一个难以形容的名称(在 C# 本身中无效的名称) .如果您想从派生类中获取属性的值,为什么不将它作为属性访问呢?即使您没有使用自动实现的属性,这也是合适的方法 - 您的字段应该是私有的。

【讨论】:

  • 是的 - 我的错误,我正在升级的代码已将支持字段指定为受保护而不是私有的,正如我所说 - 感谢您的快速回答
  • 这些名字在 C# 中是不可描述的。你确定在 VB.net 中也一样吗?
  • @CodeInChaos:不,不是现在我看过文档 :) 已编辑。
  • 实例变量(包括支持变量)如果标记为受保护,则不能在 C# 中继承。建议不要使用前导下划线作为支持变量。我通过使用 Java 约定来避免这种情况,而是使用尾随下划线。
  • @Suncat2000:这根本不是真的。 所有变量都在派生类中继承...而且我根本没有看到使用尾随下划线作为“Java约定” - 我不记得曾经见过在 Java 中,我见过很多其他的约定......
【解决方案2】:

我很确定您将无法从子类访问 Private 成员。无论如何,自动实现的属性不会生成您可以访问的支持字段(否则他们会与普通用户定义的属性完全相同)。/

【讨论】:

    猜你喜欢
    • 2019-04-03
    • 1970-01-01
    • 2012-02-07
    • 2015-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-06
    相关资源
    最近更新 更多