Have you ever had the need to expose a read-only list? I’m not just talking about a List<T> property that could not be set directly, but one that could not have any elements added, removed, or modified? There is a simple way to do this by using the AsReadOnly() method of a List<T>. Here is an example class that uses a List<string> to store the names of the authors of Design Patterns.
public class Patterns { List<string><string> _GangOfFourAuthors = new List<string> { "Gamma", "Helm", "Johnson", "Vlissides" }; public IList<string><string> GangOfFourAuthors { get { return _GangOfFourAuthors.AsReadOnly(); } } public void AddMe() { _GangOfFourAuthors.Add("Miller"); } }
A List<string> is created and initialized with the names of the authors. The GangOfFourAuthors property returns a read-only IList<string>. Look at a quick example of using the class and property to print the names of the authors to the Output window.
Patterns p = new Patterns(); IList<string> Authors = p.GangOfFourAuthors; foreach (string a in Authors) Debug.WriteLine(a); Output: Gamma Helm Johnson Vlissides
This code creates a new Patterns object, retrieves the list of authors, and then prints them to the Output window. You can see that the output matches the initialization of the List<string> in the Patterns class. At this point, elements of Authors cannot be added, removed, or modified. The following code would throw an error:
Authors.Add("Miller");
Authors cannot be changed in any way without causing an error. The original list, however, can be modified and those changes will be reflected in the read-only version of the list. If you look at the AddMe() method in the Patterns class above, you will see that it adds an element to the internal List<string> of authors. Here is code that calls that method and then outputs the list of authors.
Patterns p = new Patterns(); IList<string> Authors = p.GangOfFourAuthors; p.AddMe(); foreach (string a in Authors) Debug.WriteLine(a); Output: Gamma Helm Johnson Vlissides Miller
The AsReadOnly() method provides an easy way to restrict access to your classes’ data. The method is available for List<T> as well as arrays.
About the Author
Jay Miller is a Software Engineer with Electronic Tracking Systems, a company dedicated to robbery prevention, apprehension, and recovery based in Carrollton, Texas. Jay has been working with .NET since the release of the first beta and is co-author of Learn Microsoft Visual Basic.Net In a Weekend. Jay can be reached via email at jmiller@sm-ets.com.