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

C# | Initializing List<class object> in constructor unclear

我有2个classes:Track.cs和TrackList.cs,Track.cs用于保存轨道数据。在 TrackList 中,我想将 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);
    }

}

我的理解是,当我创建这个对象时 class: TrackList TC = new TrackList() 如果我不添加参数,列表将被初始化,但是当我发送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;
}

同样在我的作业中它说参数列表需要分配给 TrackList class 中的列表。

编辑 2

评论后我的新想法 private List<Tracks> tracks; 是对空 atm 的引用。 this.tracks = tracks 制作曲目列表 ^ 引用使用参数发送的列表 this.tracks = new List<Tracks>(tracks); 将创建一个新列表,因此曲目列表现在将引用该新列表,并且新列表与带参数发送的列表具有相同的内容。

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

编辑 3

看来我在 Edit 2 中的假设是正确的。非常感谢你们的帮助。干杯!

构造函数中的参数与您的属性同名。

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

试试这个:

class TrackList
{
    private List<Tracks> _tracks;

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

}

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

首先,我希望您编辑您的问题以合并您的 class 名称。对于我的回答,我假设轨道 class 被称为 Track 并且列表 class 被称为 TrackList (您使用 TrackClassTrackList, TrackTracks).
而你的 TrackList class 的字段 tracks 我会调用 _tracks 不要将它与构造函数参数混合 tracks.


您的 TrackList class 的字段 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 包含的列表中,因为该字段包含另一个 new 列表。
如果您分配 _tracks = tracksTrackList 将包含 same 列表,因此上面的最后一行会将新的 Track 添加到 trackList,也是(嗯,不是 "too",它只是调用 Add 相同 列表)。


所以要在这两种方式之间决定你应该问问自己:你的TrackList[=77=中的列表是否可能] 可以从 TrackList class? 之外更改 _tracks 是私有字段,所以我猜你不希望任何人更改该列表的内容来自外部。因此,您创建一个新列表并用作为参数提供的列表元素填充它的方法似乎是更好的方法。

希望我可以让自己明白。

对于我的情况,我使用了这个例子。

传递外部参数时最好使用构造函数

class TrackList
    {
        private List<Tracks> tracks;
        public List<Tracks> Tracks {get;set;}=new List<Tracks>();
    }