2016-03-15 51 views
0

我有2個類:Track.cs和TrackList.cs,Track.cs用於保存軌道中的數據。在TrackList中,我想將Track.cs的對象保存在列表中。C#|在構造函數中初始化List <class object>

這是代碼我目前有:

class TrackList 
{ 
    private List<Tracks> tracks; 

    public TrackList() 
    { 
     tracks = new List<Tracks>(); 
    } 
    public TrackList(List<Tracks> tracks) 
    { 
     this.tracks = new List<Tracks>(tracks); 
    } 

} 

我從此明白的是,當我創建這個類的一個對象:曲目TC =新專輯曲目()列表中會得到,如果我初始化不要添加參數,但是當我發送一個Track.cs對象作爲參數時,它會添加到曲目列表中。

但有人說我應該用this.tracks = tracks;而不是this.tracks = new List<Tracks>(tracks);。但我不明白爲什麼,因爲如果我使用this.tracks = tracks;我沒有使用= new List<Tracks>;部件,所以它不會被初始化。或者我錯誤地思考?

是不是一樣的,如果我在我的任務做

int id; 

public MyClass() 
{ 
    id = 0; 
} 

public MyClass(int id) 
{ 
    this.id = id; 
} 

而且它說的參數列表需要被分配到軌道列表類的列表。

編輯2

我的新後,雖然評論 private List<Tracks> tracks;是沒有什麼參考大氣壓。 this.tracks = tracks使軌道列表^引用與參數 this.tracks = new List<Tracks>(tracks);發送的列表將創建一個新列表,所以軌道列表現在將引用該新列表,並且新列表具有與發送的列表相同的內容參數。

所以用我使用的方法(最後一個)有兩個列表存在相同的內容,但private List<Tracks> tracks;將引用該新列表,我不知道用參數發送的列表會發生什麼。

編輯3

看來,我在編輯2假設是正確的。非常感謝你們的幫助。乾杯!

+1

「某人」是正確的。您已經聲明瞭它,並且您只是將現有的「軌道」參數傳遞到另一個容器的類中。不需要另一個「新」。將現有列表傳遞給「this.tracks」正在初始化它。 –

+1

另外,您需要使用構造函數鏈接。 'public TrackList():this(new List ()){}'。使用鏈接可防止在構造函數重載時出現錯誤。這種氣味是你有多個構造函數實例化/設置相同的字段/屬性。 – Will

+0

但我從來沒有說'tracks = new List ();'那麼這不就意味着它沒有被初始化?或者當我添加對象時它會自動初始化? –

回答

1

起初,我希望你編輯你的問題來鞏固你的類名。對於我的回答,我假設Track類叫做Track,名單類叫TrackList(你使用TrackClassTrackList,TrackTracks)。
而您TrackList類的字段tracks我會打電話_tracks不要將它與構造函數參數tracks混合。


TrackList類的領域tracks需要List<Track>類型的實例的引用。在構造函數中,通過調用

_tracks = new List<Track>(tracks); 

這將創建一個新的List<Track>填充有作爲參數傳遞的列表中Track實例分配一個新創建的實例。

如果分配喜歡

_tracks = tracks; 

你的字段設置爲這是作爲參數傳遞的實例參數(其被初始化,以相同的值tracks)。

這兩種方式之間的區別如下:

Track track = new Track(); 
List<Track> myTracks = new List<Track>(); 
myTracks.Add(track); 

TrackList trackList = new TrackList(myTracks); 

myTracks.Add(new Track()); 

在最後一行,我的另一個曲目添加到先前創建的列表。在您顯示的代碼中,這不會被添加到TrackList所包含的列表中,因爲該字段包含另一個新的列表。
如果您分配_tracks = tracksTrackList將包含相同列表,因此從上面的最後一行將添加新的Track到列表中trackList,太(當然,不是「太」,它僅僅是相同列表Add被調用)。


所以要決定兩種方式,你應該問自己之間它應該是可能是您的TrackList類中的名單可以從TrackList類外修改」_tracks是私人領域,所以我想你不希望任何人從外面改變這個列表的內容,所以你創建一個新列表的方式填充它作爲參數列表中的元素似乎是更好的方式。讓我自己明白。

+0

謝謝你,我編輯了我的文章(見下面的編輯2)。這是正確的嗎? –

+0

@GertjanBrouwer是的,這似乎是正確的。 –

+0

非常感謝您的解釋。 –

2

構造函數中的參數與您的屬性具有相同的名稱。

更改構造函數中的屬性或參數。

試試這個:

class TrackList 
{ 
    private List<Tracks> _tracks; 

    public TrackList() 
    { 
     _tracks = new List<Tracks>(); 
    } 
    public TrackList(List<Tracks> tracks) 
    { 
     _tracks = new List<Tracks>(tracks); 
    } 

} 
+0

這沒有關係,我使用This.tracks,因此它會使用列表。 –

0

如果使用this.tracks = tracks,那麼別人已經創建的初始列表可以不使用曲目列表類的更新。這是可行的,並且這可以防止數組分配。但是TrackList類失去了對列表的控制。