.NET Tip: Creating a Read-Only List

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.



Comments

  • There are no comments yet. Be the first to comment!

Leave a Comment
  • Your email address will not be published. All fields are required.

Top White Papers and Webcasts

  • Organizations across the world continue to strive for greater agility, efficiency, and innovation. But they also need to cut costs, improve productivity and become more competitive. These new requirements create complexity and extra tasks for IT to manage. But with greater complexity, it is easy to miss a minor system vulnerability, which in turn can cause major security issues. This white paper analyzes how complexity in the IT environment is causing new security challenges and how best to address this …

  • IT decision support impacts all aspects of technology management, from governance and strategy to budgets and resource planning. IT decision support effectiveness often falls prey to data-driven challenges that make it difficult to understand the data in context. These challenges: overwhelming data volumes, heterogeneous data types, and growing data complexity. This Forrester Consulting Paper reports the three key findings from their study conducted, on behalf of BDNA, to test the hypothesis that data …

Most Popular Programming Stories

More for Developers

Latest Developer Headlines

RSS Feeds