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,我知道您会这么做。我只是在为海报添加评论供大家思考。