.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

  • It's time high-level executives and IT compliance officers recognize and acknowledge the danger of malicious insiders, an increased attack surface and the potential for breaches caused by employee error or negligence. See why there is extra emphasis on insider threats.

  • Live Event Date: April 29, 2014 @ 2:00 p.m. ET / 11:00 a.m. PT Leveraging Flash storage to accelerate an Oracle Real Application Clusters (RAC) environment is one of today's hottest technology topics. Oracle databases require guaranteed levels of storage performance and high availability of data. Until recently, Oracle RAC could only use Flash storage for SmartFlash Cache, which addresses some performance improvements, but limits the benefits that can be gained from a shared Flash infrastructure. Enter …

Most Popular Programming Stories

More for Developers

Latest Developer Headlines

RSS Feeds