Introduction
In the preceding hierarchical diagram, you can see core generic interfaces and read-only interface. I assume you are familiar with core generic interfaces, so here I'm not discussing more them. Read-only interfaces were introduced only recently with .NET 4.5 They essentially have all the functionality for modifying collections from generic interfaces removed, letting you expose interfaces to other code without any risk of that code being able to use those interfaces to modify collections.
Look at the read-only part of the hierarchy. The read-only interfaces start with an interface called
IReadOnlyCollection that mirrors
ICollection. We saw that the main branch splits into three at this point. The read-only interfaces do the same thing except that there's no read-only equivalent of I
Set. The only read-only interfaces are
IReadOnlyList and
IReadOnlyDictionary. As I said earlier, read-only interfaces do not expose anything to modify the collection.
IReadOnlyCollection<T>
This is a very simple interface. We can start with ICollection. You can see the ICollection interface in the following sample.
Remove all the stuff to do the modification of the collection and we also remove the
Contains() and
CopyTo() methods.
So what are we left with? Yes, the Count property.
IReadOnlyCollection is enumerable that also knows how many elements it has and I think that's potentially rather a nice interface to have available.
Example
IRedOnlyList follows the spirit of
IReadOnlyCollection. It adds those IList methods that are read-only and unambiguously useful and this is the result. You get
IReadOnlyCollection plus the indexer, but only read-only access and that's it. In the following picture, you can see the
IReadOnlyList<T> interface.
Example
IReadOnlyDictionary is unusual for the read-only interfaces and is quite powerful. It contains all the added functionality of
IDictionary except obviously for the ability to add or remove items. In the following sample, you can see the
IDictionary interface.
You can see the
IReadOnlyDictionary<Tkey,TValue> interface below.