为什么我不能从继承的类中访问自动实现的属性上的Backing Field

时间:2011-12-20 15:10:55

标签: .net vb.net oop class inheritance

我有一个暴露自动实现的属性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

但是如果我没有使用auto实现的属性并声明我自己的后台字段,可以从子类访问:

Private _Enabled as Boolean

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

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

2 个答案:

答案 0 :(得分:1)

  

但是如果我没有使用auto实现的属性并声明我自己的后台字段,可以从子类访问:

Private _Enabled as Boolean

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

来自docs for the Private modifier

  

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

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

答案 1 :(得分:1)

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