簡體   English   中英

為什么我們不能訪問派生 class 中方法之外的基本屬性?

[英]Why can't we access a base property outside of a method in derived class?

我遇到了這個問題

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 說“除了字段初始值設定項之外,代碼必須在方法中”。

為什么派生的 class 不能訪問方法外部的屬性? 這背后的原因是什么?

您不能將任何代碼放在方法之外(字段初始值設定項除外)。

所有代碼都需要有一個特定的時間點才能執行。
具體來說,代碼將在調用包含它的方法時執行。

要回答您要問的問題,字段初始化程序無法訪問 class 實例,因為它們在構造函數之前運行。
因此,您不能在字段初始化程序中使用來自您自己的 class 或基礎 class 的實例成員。

想象一下,理論上允許您提出的要求,那么需要回答的一個重要問題是:何時執行此代碼? 一種選擇是在構造函數運行之前或之后立即運行它。 但是,您可以將代碼放在構造函數中(無論是在開頭還是結尾),不是嗎? 為什么要讓構造函數代碼遍布 class? 除了使解析和閱讀代碼更加困難之外,您什么也得不到。

C#構造函數執行順序為:

  • 將成員變量初始化為層次結構中所有類的默認值

然后從最衍生的 class 開始:

  • 為最衍生的類型執行變量初始化器
  • 構造函數鏈接確定將調用哪個基本 class 構造函數
  • 基礎 class 被初始化(遞歸所有這些:)
  • class 鏈中的構造函數體被執行(注意,如果它們與 Foo() 鏈接,則可以有多個:this(...) 等

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM