Remove some allocation from NotifyCollectionChangedEventArgs (#54899)
authorStephen Toub <stoub@microsoft.com>
Wed, 30 Jun 2021 11:56:26 +0000 (07:56 -0400)
committerGitHub <noreply@github.com>
Wed, 30 Jun 2021 11:56:26 +0000 (07:56 -0400)
commit1ceda71444850106c043d07457bcb0d9219e405c
tree620fb039c297b2288ecbcc583f748208ed4534ab
parentde8d4e8b7dc56395d19fb7579b56f79f5d12c167
Remove some allocation from NotifyCollectionChangedEventArgs (#54899)

* Remove some allocation from NotifyCollectionChangedEventArgs

When initialized with a single object rather than a list of objects (single object is very common), the args is allocating an object[] and then wrapping that object[] in a ReadOnlyList.  We can instead just allocate a simple read-only IList wrapper for the object directly; that also makes accessing it faster.

Additionally, when constructing an instance using `public NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction action, IList? changedItems, int index, int oldIndex)`, even though the same collection instance is used for both the new and old items, it wraps it twice.  We can wrap it once.

Along the way I also simplified the code, enabling the fields to become readonly, removing duplicate assignments of fields, etc.

* Address PR feedback
src/libraries/System.ObjectModel/src/System.ObjectModel.csproj
src/libraries/System.ObjectModel/src/System/Collections/CollectionHelpers.cs [new file with mode: 0644]
src/libraries/System.ObjectModel/src/System/Collections/ObjectModel/ReadOnlyDictionary.cs
src/libraries/System.ObjectModel/src/System/Collections/Specialized/NotifyCollectionChangedEventArgs.cs