C#|在构造函数中初始化List <class object =“”>不清楚

时间:2016-03-15 20:12:55

标签: c# list initialization assign

我有2个类:Track.cs和TrackList.cs,Track.cs用于保存轨道中的数据。在TrackList中,我想在List中保存Track.cs的对象。

这是我目前的代码:

class TrackList
{
    private List<Tracks> tracks;

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

}

我从中理解的是,当我创建这个类的对象时:TrackList TC = new TrackList()如果我不添加参数,列表将被初始化,但是当我发送一个Track.cs时object作为参数将添加到曲目列表中。

但有人说我应该使用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;
}

同样在我的作业中,它表示需要将参数列表分配给TrackList类中的列表。

修改2

我的新评论后发表评论 private List<Tracks> tracks;是对无所谓的提及。 this.tracks = tracks使轨道列表^引用使用参数发送的列表 this.tracks = new List<Tracks>(tracks);将创建一个新列表,因此曲目列表现在将引用该新列表,新列表与使用参数发送的列表具有相同的内容。

因此,使用我使用的方法(最后一个),存在2个具有相同内容的列表,但private List<Tracks> tracks;将引用该新列表,我不知道使用参数发送的列表会发生什么

编辑3

似乎我在编辑2中的假设是正确的。非常感谢你们的帮助。干杯!

3 个答案:

答案 0 :(得分:2)

构造函数中的参数与您的属性具有相同的名称。

更改构造函数中的属性或参数。

试试这个:

class TrackList
{
    private List<Tracks> _tracks;

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

}

答案 1 :(得分:1)

首先,我希望您编辑问题以合并您的班级名称。对于我的回答,我假设Track类被称为Track,而列表类被称为TrackList(您使用TrackClassTrackListTrackTracks)。
tracks课程的TrackList字段_tracks我会将tracks称为,而不是将其与构造函数参数tracks混合。

TrackList类的字段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 = tracks包含的列表中,因为该字段包含另一个列表。
如果您分配了TrackListTrack将包含相同的列表,那么上面的最后一行会将新的trackList添加到Add的列表中也是(好吧,不是“太”,它只是调用TrackList相同的列表)。

所以决定在两种方式之间你应该问自己: TrackList类中的列表是否可以从_tracks外部更改} class?“ angular.bootstrap(document.getElementById("myId"), ['myApp']);是一个私有字段,所以我猜你不希望任何人从外面更改该列表的内容。所以你创建一个新列表的方式填充它的元素作为参数提供的列表似乎是更好的方法。

希望我能让自己理解。

答案 2 :(得分:0)

如果您使用this.tracks = tracks,则创建初始列表的其他人可以在不使用TrackList类的情况下更新它。这是有效的,这可以防止数组分配。但是TrackList类失去了对列表的控制权。