为什么我们不能在派生类中访问方法之外的基本属性?

时间:2011-07-19 02:32:47

标签: c# .net properties

我遇到了this question

namespace ClassLibrary3
{
    public class Class1
    {
        public int a { get; set; }
        public int A { get; set; }
    }

    public class test : Class1
    {
        a=1; // error 'ClassLibrary3.Class1.a' is a 'property' but is used like a 'type'
        public void hello()
        {
            a = 10;
        }
    }
}

Marc Gravell说“除了字段初始值设定项,代码必须在方法中”。

为什么派生类不能访问方法之外的属性?这背后的原因是什么?

3 个答案:

答案 0 :(得分:7)

您不能将任何代码放在方法之外(字段初始值设定项除外)。

所有代码都需要具有特定的执行时间点 具体来说,代码将在调用包含它的方法时执行。

要回答您要问的问题,字段初始化程序无法访问类实例,因为它们在构造函数之前运行。
因此,您不能使用您自己的类中的实例成员或字段初始值设定项中的基类。

答案 1 :(得分:2)

想象一下,你理论上允许你提出什么要求然后要回答的一个重要问题是:这个代码何时应该被执行?一种选择是在构造函数运行之前或之后立即运行它。但是,你可以把代码放在构造函数中(无论是在开头还是结尾)不是吗?你为什么要让构造函数代码遍布整个类?除了使解析和阅读代码更难以获得任何东西之外。

答案 2 :(得分:1)

C#构造函数执行顺序是:

  • 成员变量初始化为所有类的默认值 层次结构

然后从派生程度最高的类开始:

  • 为最派生类型执行变量初始值设定项
  • 构造函数链接计算出哪个基类构造函数 被称为
  • 初始化基类(递归所有这些:)
  • 执行此类链中的构造函数体(注意 如果它们与Foo()链接在一起可以有多个:这个(...)等