为什么NotifyCollectionChangedEventArgs的NewItems和OldItems为复数形式?

时间:2019-05-29 06:10:35

标签: c# .net generics

我是C#和OOP的新手,只是一个关于NotifyCollectionChangedEventArgs的问题。我不明白为什么它有NewItems和OldItems而不是NewItemOldItem。 例如,我们将ObservableCollection用作:

ObservableCollection<Person> people = new ObservableCollection<Person>()
// Wire up the CollectionChanged event.
people.CollectionChanged += people_CollectionChanged;

static void people_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
{
   if (e.Action == NotifyCollectionChangedAction.Add)
   {
     foreach (Person p in e.NewItems)
     {
        Console.WriteLine(p.ToString());
     }
   }

}

因此,每次我们在集合中添加新的Person时都是:

people.Add(new Person("John", "Smith", 32));

CollectionChanged触发people_CollectionChanged,所以e.NewItems仅包含一个人(我刚刚添加的人),因此假设e.NewItems可以有多个人是什么意思呢?项,因为它总是只能有一项?

2 个答案:

答案 0 :(得分:3)

您要订阅的事件实际上是由INotifyCollectionChanged界面定义的,并由ObservableCollection实现。

虽然ObservableCollection没有一次添加多个项目的方法,但确实有一个ClearItems方法,该方法可以一次删除多个项目。这就是我想到复数名称的原因之一,因为它们可以包含多个项目。

此外,由于它是一个接口,因此可以由其他确实实现诸如AddRangeRemoveWhere等方法的类来实现,这将再次引发具有多个项目的事件。

答案 1 :(得分:1)

如果您查看official documentation,您会发现支持实体是IList的实现。鉴于这是一个列表,所以属性名称是复数形式是很自然的。

例如,如果我使用AddRange,将一次添加多个项目,并且NewItems(如果删除了内容,则为OldItems)将被填充多个条目