C# System.Collections.ObjectModel集合<;T>;

C# System.Collections.ObjectModel集合<;T>;,c#,collections,C#,Collections,我正在努力理解这门课: public class Track { public string Title { get; set; } public uint Length { get; set; } public Album Album { get; internal set; } } public class Album : Collection<Track> { protected override void InsertItem

我正在努力理解这门课:

public class Track 
{ 
    public string Title { get; set; } 
    public uint Length { get; set; } 
    public Album Album { get; internal set; } 
} 

public class Album : Collection<Track> 
{ 
    protected override void InsertItem(int index, Track item) 
    { 
        base.InsertItem(index, item); 
        item.Album = this; 
    } 

protected override void SetItem(int index, Track item) 
{ 
    base.SetItem(index, item); 
    item.Album = this; 
} 

protected override void RemoveItem(int index) 
{ 
    this[index].Album = null;
   base.RemoveItem(index); 
} 

protected override void ClearItems() 
{ 
    foreach (Track track in this) 
    { 
        track.Album = null; 
    } 
    base.ClearItems(); 
} 
} 
公共类曲目
{ 
公共字符串标题{get;set;}
公共uint长度{get;set;}
公共相册相册{get;internal set;}
} 
公共类专辑:收藏
{ 
受保护的覆盖无效插入项(整数索引,跟踪项)
{ 
基本插入项(索引,项目);
item.Album=这个;
} 
受保护的覆盖无效集合项(整数索引,跟踪项)
{ 
base.SetItem(索引,项);
item.Album=这个;
} 
受保护的覆盖void removietem(int索引)
{ 
此[index].Album=null;
基本删除项(索引);
} 
受保护的覆盖无效ClearItems()
{ 
foreach(此中的轨迹)
{ 
track.Album=null;
} 
base.ClearItems();
} 
} 
为什么在分配后使用base.InsertItem 新变量?省略base.InsertItem和其他变量可以吗 (设置、删除、清除项目)


我想我的问题还不够清楚

在我看来,base.InsertItem是一种集合方法 将项添加到集合中。所以如果我们已经 添加了我们将此项分配给item.Album的原因

我对这张专辑有点困惑 类和正在使用集合的相册类

有人能给我举一个使用这个集合的例子吗?
谢谢大家!

为什么在分配新变量后使用
base.InsertItem

Track
是一个
,因此它具有引用类型语义。这意味着,您可以在之前、之后、任何时候为其
Album
属性赋值,这其实并不重要,因为它存在于托管堆上,其他一切都只是对它的引用

您所展示的是一个常见的习惯用法-您将
曲目
添加到
专辑
(这是
曲目
集合),然后设置“back reference”:您将
曲目
专辑
属性设置为刚刚添加到的
专辑

请注意,它们在调用
InsertItem
后执行有问题的赋值,因为这是事件的正确顺序。该项在添加后才成为集合的一部分。还要注意,
removietem
override以相反的顺序执行此操作

是否可以省略
base.InsertItem
和其他(设置、删除、清除项目)


你告诉我-这取决于你计划如何使用代码。您所展示的是一个简单的强类型集合,它管理您添加到该集合中的项的“容器引用”。它是整个
窗口中使用的通用格式。例如,表单
代码。

您有此方法覆盖:

protected override void InsertItem(int index, Track item)
{ 
    base.InsertItem(index, item); 
    item.Album = this; 
}
这将更改从基类
集合继承的属性。第一行从基类调用实现。在那之后,我们做了与基类相同的事情。第二行通过提供对当前收藏的引用(
Album
)来修改插入的项目

不清楚您要求什么,但假设您这样做:

protected override void InsertItem(int index, Track item)
{ 
    InsertItem(index, item);    // bad
    item.Album = this; 
}
这不是一个好主意,因为现在该方法无限递归地调用自己。所以这不是一个选择

假设您这样做:

protected override void InsertItem(int index, Track item)
{ 
    item.Album = this; 
}
现在,
InsertItem
方法所做的唯一的事情就是将
相册
写入
。在基础集合中实际上没有插入任何内容。这可能不是你想要的



那么
base
关键字是什么?它允许您调用基类的方法(或其他成员),即使该方法在当前类上被hidden覆盖。您的示例给出了
base
访问的典型用法。

我要说的是在
base
调用中保留,因为您希望运行默认的收集方法。在这一点上,他唯一可以改变的是删除反向引用,并在整个代码中执行这些操作(示例试图简化这些操作)。我要说的是保持现状,除非你开发了一种你想要实现的不同技术方法。除非您了解当前代码的功能及其原因,否则您无法执行此操作。@ps2goat我将调用
基调用
基本调用-删除它们,集合将不存储任何内容(当然,除非您删除覆盖)。@Johnathon Reinhart,我知道您会这么做。我只是在为海报添加评论供大家思考。