簡體   English   中英

為什么我的C#基本構造函數沒有被調用?

[英]why doesn't my c# base constructor get called?

public class Animal
{
    public Animal()
    {
        "animal ctor".Dump();
    }
}

public class Cat :Animal
{
    public Cat():this("gray")
    {
        "cat ctor".Dump();
    }

    public Cat(string c):base()
    {
        "cat ctor2".Dump();
    }
}

void Main()
{
    Cat a = new Cat();
}

代碼的輸出為:

animal ctor
cat ctor2
cat ctor

我了解第一行。

首先調用Animal Ctor,然后再調用Cat ctor調用字符串重載public Cat(string c):base() -但這還調用了base的構造函數。

那么,為什么我再也看不到animal ctor:base() )?

構造函數僅被調用一次:

  1. 您的Cat()構造函數調用Cat(string c)
  2. Cat(string c)正在調用基本構造函數
  3. 基本構造函數被執行
  4. Cat(string c)被執行(是base的調用者)
  5. 然后執行Cat()構造函數

基本上,如果您調用基本構造函數(或類中的另一個構造函數),則在構造函數之前執行。有關更多詳細信息,請參見文檔

Cat()顯式調用Cat(string) ,后者顯式調用Animal()

這些調用每種方法開始之前發生,因此您會看到它們以相反的順序轉儲。

Cat()不會直接調用Animal() ,這意味着基類的構造函數只會被調用一次(這可能是您想要的)

如果您未明確指定要調用的構造函數,則將調用基類的默認構造函數;否則,將返回默認類。 因此,以下內容:

public Cat(string c) :base()
{
    "cat ctor2".Dump();
}

等效於:

public Cat(string c)
{
    "cat ctor2".Dump();
}

有一些繼承和對象構造規則。

在這里,構造函數按以下順序調用:Cat():this(string),即Cat(string):base(),即Animal()

動物是貓的基礎,因此首先要構造動物。 一旦Animal()構造函數調用完成,則Cat(string)將完成,隨后Cat()調用將完成。

即使您不提及base(),base也將被調用。 默認情況下,始終會調用無參數構造函數(如果有的話),並且此過程會冒泡到層次結構中最頂層的父級。

對於每個類,始終存在無參數構造函數。 但是,如果用參數聲明一個,則顯式地需要聲明一個無參數的構造函數。

暫無
暫無

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

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