簡體   English   中英

如何調用構造函數初始化器 base() 和 this()?

[英]how do i call both constructor initializers, base() and this()?

這很容易解決,但我只是好奇我是否可以使用語言功能,或者語言不允許它的事實意味着我在 class 設計中犯了一個邏輯錯誤。

我正在對我的代碼進行自我審查,以幫助“強化”它以供重復使用,而我剛剛遇到:

public partial class TrackTyped : Component
{
    IContainer components = null;

    public TrackTyped()
        : base()
    {
        InitializeComponent();
    }

    public TrackTyped(IContainer container)
        : base()
    {
        container.Add(this);
        InitializeComponent();
    }
}

當我在兩個構造函數中看到同一行代碼時,我通常會用“this()”調用另一個,但我似乎做不到。

如果我正確閱讀了規范(我剛開始嘗試閱讀規范,所以我可能不對):

10.11 Instance Constructors
   constructor-declarator:
      identifier   (   formal-parameter-listopt   )   constructor-initializeropt
   constructor-initializer:
      :   base   (   argument-listopt   )
      :   this   (   argument-listopt   )

它是說我只能擁有其中一個。

問題:10.11 是否暗示沒有理由需要同時調用兩者,或者只是暗示該語言只支持調用一個?

無需同時調用兩者,因為this會重定向到另一個將調用base的構造函數。

這似乎是你想要的:

public partial class TrackTyped : Component
{
    IContainer components = null;

    public TrackTyped()
        : base()
    {
        InitializeComponent();
    }

    public TrackTyped(IContainer container)
        : this()
    {
        container.Add(this);
    }
}

不過,現在第二個構造函數中語句的順序不同了。 如果這很重要,那么就沒有真正的好方法來做你想做的事,因為即使你有相同的line ,功能也有細微的不同。 在這種情況下,您只需要重復單行即可。 不要出汗。

而且您正在正確閱讀規范:它必須是其中之一。

你沒有,你也不能。 您可以通過:this(...)將構造函數調用轉發給相同 class 的另一個構造函數。 該鏈中的最后一個構造函數必須通過:base(...)隱式或顯式初始化基礎

假設 class A 有兩個構造函數。 一個用:base(2)初始化基礎,另一個用:base(3)初始化。 如果允許第一個構造函數也指定:this (/*call the other ctor*/) base 應該如何初始化:使用 2 還是 3? 這就是為什么這些事情是不允許的

通常在 class 中完成,具有多個要通過構造函數初始化的屬性,其中一些是可選的。 我們有一個最大的構造函數,它接收所有調用基本構造函數的參數。 所有其他構造函數通過將 null/默認值傳遞給這個大構造函數來重定向到這個構造函數。 這樣,所有初始化代碼都保留在一個地方,可供其他人重用。

public MissingEntityException(Type type, string criteria, string message = "") 
    : this(type, criteria, message, null)
{           
}

public MissingEntityException(Type type, string criteria, string message, Exception innerException) 
     : base(message, innerException) 
{
    this.EntityType = type;
    this.Criteria = criteria;
}

這在層次結構中得到支持,並且可以涉及任何數量或參數。

這是你想要的?

public partial class TrackTyped : Component
{
    IContainer components = null; 
    public TrackTyped() : base()
    {
        // logic for InitializeComponent() here
    } 

    public TrackTyped(IContainer container) : this()
    {
        container.Add(this)
    }
}

順便說一句:對於第二個 ctor,這是一個有趣的用法:

var a = TrackTyped(container);

我想知道刪除第二個 ctor 並這樣做對您來說是否會更清楚? (相同的最終結果)

container.Add(new TrackTyped());

暫無
暫無

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

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