.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

  • Learn How A Global Entertainment Company Saw a 448% ROI Every business today uses software to manage systems, deliver products, and empower employees to do their jobs. But software inevitably breaks, and when it does, businesses lose money -- in the form of dissatisfied customers, missed SLAs or lost productivity. PagerDuty, an operations performance platform, solves this problem by helping operations engineers and developers more effectively manage and resolve incidents across a company's global operations. …

  • Today's agile organizations pose operations teams with a tremendous challenge: to deploy new releases to production immediately after development and testing is completed. To ensure that applications are deployed successfully, an automatic and transparent process is required. We refer to this process as Zero Touch Deployment™. This white paper reviews two approaches to Zero Touch Deployment--a script-based solution and a release automation platform. The article discusses how each can solve the key …

Most Popular Programming Stories

More for Developers

RSS Feeds