2015-07-19 42 views
0

我想維護創建的我的類的所有實例的列表。我認爲我可以通過在構造函數中將「this」添加到靜態列表中來實現。當然,C#不允許我在構造函數中引用'this',因爲它尚未完全構造。這是有道理的,但我試圖找出完成這個最好的方法。如何在c#中的構造函數中創建對象的靜態列表?

class Thing 
{ static List<Thing> AllTheThings; 

    public Thing() 
    { 
    AllTheThings.Add(this); // can't reference 'this' here 
    } 

} 

我能想到的兩種方法是:

  1. 讓建設者私人和創建調用構造函數,並增加了新的實例列表中的靜態方法(「MakeNewThing」)。 我擔心沒有公共構造函數的潛在問題,但我不確定它們是什麼。
  2. 創建一個包含Thing's的shell類('ThingShell')。 ThingShell的構造函數創建一個Thing並將其添加到列表中。 這很混亂,需要ThingShell來代理Thing的所有成員。

我似乎記得大約20年前在C++中做這樣的事情,但不記得細節,也找不到代碼。

任何人有更好的想法?

+2

你發佈的代碼工作正常,除了你永遠不會初始化'AllTheThings'。在構造函數體內引用'this'完全合法。請發佈實際上失敗的代碼。你不能在構造器*初始化器*中使用'this',例如'base(this.Foo())' –

+0

「**關鍵字'this'在靜態屬性,靜態方法或靜態字段初始值設定項中無效**」 - 我在試用代碼時得到的結果。 @JonSkeet :) –

+0

Doh!我非常關注'這個',所以我完全錯過了AllTheThings是沒有意義的。謝謝!這樣可行。 – GMAP

回答

0

正如@Jon Skeet所說,對「this」的引用應該沒有問題。但爲了以防萬一,這是另一種方法。現在

public class Thing 
{ 
    public readonly static List<Thing> AllTheThings = new List<Thing>(); 

    //making the constructor private so that no other code can call it. 
    private Thing() { } 

    //providing a static instance method for creating the object 
    public static Thing Instance() 
    { 
     var t = new Thing(); 
     Thing.AllTheThings.Add(t); 
     return t; 
    } 
} 

,那東西(原諒雙關語)在這個實現需要注意的是,通過讓應用程序實例化的「物聯網」這一靜態列表,你將運行內存污水池的風險如果你沒有辦法在範圍內不再需要舊的「事物」時擺脫它。

相關問題