Read-Only interface in .NET

facebooktwittergoogle_plusredditpinterestlinkedinmail

Introduction
In this article I’m discussing about the brand new .NET 4.5 read-only interfaces and it’s similarity with core generic interfaces.

Readonly interfaces

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 about 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 ISet. 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
This is a very simple interface. We can start from ICollection. You can see the ICollection interface in the following sample.

IReadOnlyCollection  structrue 1

Remove all the stuff to do the modification of the collection and we also remove the Contains() and CopyTo() methods.

IReadOnlyCollection  structrue 2

So what are we left with? Yes, the Count property. IReadOnlyCollection is an enumerable that also knows how many elements it has and I think that’s potentially rather a nice interface to have available.

Example

IReadOnlyCollection  structrue 3

IReadOnlyList

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 picuture you can see the IReadOnlyList interface

IReadOnlyList structure 1

Example :

IReadOnlyList structure 2

IReadOnlyDictionary

IReadOnlyDictionary is unusually 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.

IReadOnlyDictionary structure 1

You can see the IReadOnlyDictionary interface below.

public interface IReadOnlyDictionary < TKey, TValue > : IReadOnlyCollection < KeyValuePair < TKey,  
TValue >> ,  
IEnumerable < KeyValuePair < TKey,  
TValue >> ,  
IEnumerable  
  {  
    IEnumerable < TKey > Keys  
    {  
        get;  
    }  
    IEnumerable < TValue > Values  
    {  
        get;  
    }  
    TValue this[TKey key]  
    {  
        get;  
    }  
    bool ContainsKey(TKey key);  
    bool TryGetValue(TKey key, out TValue value);  
}

The IReadOnlyDictionary interface looks quite nice and useful if you want to expose read-only functionality on a Dictionary.

Conclusion

Read-only interfaces look quite nice and useful if you want to expose read-only functionality on core generic type interfaces like ICollection, IList and IDictionary.

The following two tabs change content below.

Tom Mohan

Tom Mohan is a technologist who loves to code and build. He enjoys working on Microsoft Technologies. Tom specializes in ASP.NET MVC, Web API , Azure, C# ,WPF, SQL etc and holds a Bachelor engineering degree in Computer Science. Certification : MCSD , MCTS