代码之家  ›  专栏  ›  技术社区  ›  Gertjan Brouwer

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

  •  1
  • Gertjan Brouwer  · 技术社区  · 10 年前

    我有两个班:田径。cs和TrackList。cs,轨迹。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);
        }
    
    }
    

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

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

    这和我这样做一样吗

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

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

    编辑2

    评论后我的新想法 private List<Tracks> tracks; 指的是atm。 this.tracks = tracks 使曲目列表^引用与参数一起发送的列表 这tracks=新列表<曲目>(轨道); 将创建一个新列表,所以曲目列表现在将引用该新列表,并且新列表的内容与使用参数发送的列表相同。

    因此,使用我使用的方法(最后一个),存在两个列表,内容相同,但 私有列表<曲目>轨道; 将引用该新列表,我不知道与参数一起发送的列表会发生什么。

    编辑3

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

    4 回复  |  直到 10 年前
        1
  •  3
  •   billybob    10 年前

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

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

    试试这个:

    class TrackList
    {
        private List<Tracks> _tracks;
    
        public TrackList()
        {
            _tracks = new List<Tracks>();
        }
        public TrackList(List<Tracks> tracks)
        {
            _tracks = new List<Tracks>(tracks);
        }
    
    }
    
        2
  •  1
  •   René Vogt    10 年前

    首先,我希望您编辑您的问题,以合并您的班级名称。对于我的答案,我假设Track类被调用 Track 和要调用的列表类 TrackList (您使用 TrackClass 曲目列表 , 轨道 Tracks ).
    而这个领域 tracks 您的 曲目列表 我会给班级打电话 _tracks 不要将其与构造函数参数混合 轨道 .


    该字段 轨道 您的 曲目列表 类引用类型为的实例 List<Track> 。在构造函数中,通过调用

    _tracks = new List<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());
    

    在最后一行,我将另一首曲目添加到先前创建的列表中。在您显示的代码中,它不会添加到包含的列表中 曲目列表 ,因为该字段包含另一个 列表
    如果您指定 _tracks = tracks , 曲目列表 将包含 相同的 列表,因此上面的最后一行将添加新的 轨道 添加到中的列表 trackList (哦,不是“太”,它只是 相同的 列出 Add 被调用)。


    因此 决定 你应该问自己: 是否有可能 曲目列表 类可以从外部更改 曲目列表 班" _轨道 是一个私有字段,所以我想你不希望任何人从外部更改该列表的内容。因此,您创建一个新列表的方法,用作为参数提供的列表元素填充它,似乎是更好的方法。

    希望我能让自己理解。

        3
  •  0
  •   Kalten    10 年前

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

        4
  •  0
  •   Mahmoud Nasr    4 年前

    在我的例子中,我用了这个例子。

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

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