【问题标题】:Why can't we access a base property outside of a method in derived class?为什么我们不能访问派生类中方法之外的基属性?
【发布时间】:2011-07-19 02:32:47
【问题描述】:

我遇到了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 说“除了字段初始化器,代码必须在方法中”。

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

【问题讨论】:

标签: c# .net properties


【解决方案1】:

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

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

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

【讨论】:

  • 我认为他指的是您可以拥有类似“int x = 5;”的事实在方法之外,但不能为从父级派生的变量赋值。
  • 为了完整起见:int x = 5 编译为一个分配 x=5 的构造函数。
  • 是的,你不能那样做。为什么不把它放在派生类的构造函数中?
【解决方案2】:

想象一下理论上允许您提出的要求,那么需要回答的一个重要问题是:何时执行此代码?一种选择是在构造函数运行之前或之后立即运行它。但是,您可以将代码放在构造函数中(无论是在开头还是结尾),不是吗?为什么要允许构造函数代码散布在整个类中?除了使解析和阅读代码变得更加困难之外,您没有任何收获。

【讨论】:

    【解决方案3】:

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

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

    然后从派生最多的类开始:

    • 为派生最多的类型执行变量初始化器
    • 构造函数链确定哪个基类构造函数将运行 被称为
    • 基类已初始化(递归所有这些:)
    • 执行这个类中链中的构造函数体(注意 如果它们与 Foo() 链接在一起,可能会有多个:this(...) 等

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-30
      • 1970-01-01
      • 2020-02-11
      • 1970-01-01
      • 2010-09-21
      相关资源
      最近更新 更多