【问题标题】:C# | Initializing List<class object> in constructor unclearC# |在构造函数中初始化 List<class object> 不清楚
【发布时间】:2016-07-01 11:29:29
【问题描述】:

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

这是我目前拥有的代码:

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 对象为将添加到曲目列表中的参数。

但是有人说我应该使用this.tracks = tracks; 而不是this.tracks = new List&lt;Tracks&gt;(tracks);。但我不明白为什么,因为如果我使用 this.tracks = tracks; 我还没有使用 = new List&lt;Tracks&gt;; 部分,所以它不会被初始化。还是我想错了?

和我做这个一样吗

int id;

public MyClass()
{
    id = 0;
}

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

在我的作业中它还说参数列表需要分配给 TrackList 类中的列表。

编辑 2

我的新虽然在评论后 private List&lt;Tracks&gt; tracks; 是对任何 atm 的引用。 this.tracks = tracks 使曲目列表 ^ 引用与参数一起发送的列表 this.tracks = new List&lt;Tracks&gt;(tracks); 将创建一个新列表,因此曲目列表现在将引用该新列表,并且新列表与带参数发送的列表具有相同的内容。

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

编辑 3

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

【问题讨论】:

  • “某人”是正确的。您已经声明了它,在这里您只是将现有的“tracks”参数传递给 Class 到另一个容器。不需要另一个“新”。将现有列表传递给“this.tracks”正在对其进行初始化。
  • 另外,你需要使用构造函数链。 public TrackList() : this(new List&lt;Tracks&gt;()) { }。使用链接可以防止在构造函数重载时出现错误。这样做的味道是您有多个构造函数实例化/设置相同的字段/属性。
  • 但是我从来没有说过tracks = new List&lt;Tracks&gt;(); 所以这不是说它没有初始化吗?还是在我添加对象时它会自动初始化?
  • new 初始化给定类型的对象。你接受了一个List&lt;Tracks&gt; 类型的对象,所以无论谁发布这个实例,都是将对象传递给你的那个人。如果需要,您可以验证它不为空。我强烈建议您通过 C# 获取 CLR 的副本。跳过前两章并阅读。大约需要一天时间。
  • 不,您将一个现有列表(在别处实例化)分配给您的局部变量

标签: c# list initialization assign


【解决方案1】:

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

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

试试这个:

class TrackList
{
    private List<Tracks> _tracks;

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

}

【讨论】:

  • 这个没关系,我用This.tracks所以它会用到列表。
【解决方案2】:

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


TrackList 类的字段tracks 引用List&lt;Track&gt; 类型的实例。在您的构造函数中,您通过调用分配一个新创建的实例

_tracks = new List<Track>(tracks);

这将创建一个新的List&lt;Track&gt;,其中填充了作为参数传递的列表中的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 的列表中(嗯,不是 "也”,它只是调用Add相同列表)。


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

希望我可以让我自己理解。

【讨论】:

  • 谢谢,我编辑了我的帖子(见下方编辑 2)。对吗?
【解决方案3】:

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

【讨论】:

    【解决方案4】:

    就我而言,我使用了这个例子。

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-06-30
      • 1970-01-01
      • 2011-02-22
      • 1970-01-01
      • 2021-06-30
      • 2022-11-17
      • 1970-01-01
      • 2012-10-23
      相关资源
      最近更新 更多