Recipe5.17.Creating a Read-Only Array or ListT


Recipe 5.17. Creating a Read-Only Array or List<T>

Problem

You need a way to create a read-only Array or List<T>, where the Array or List<T> itself is read-only.

Solution

Use the AsReadOnly method of the Array or List<T> class as shown here:

 // Create and populate a List of strings. List<string> strings = new List<string>( ); strings.Add("1"); strings.Add("2"); strings.Add("3"); strings.Add("4"); // Create a read-only strings List.  IList<string> readOnlyStrings = strings.AsReadOnly( ); // Display them. foreach (string s in readOnlyStrings)     Console.WriteLine(s); 

Discussion

The AsReadOnly method accepts no parameters and returns a read-only wrapper around the collection on which it is called. For example, the following statement:

  IList<string> readOnlyStrings = strings.AsReadOnly(); 

returns a read-only IList<string> type from the original strings List<string> type. This read-only readOnlyStrings variable behaves similarly to the original strings object, except that you cannot add, modify, or delete elements from this object. If you attempt one of these actions, a System.NotSupportedException will be thrown along with the message "Collection is read-only". Any of the following lines of code will cause this exception to be thrown:

 readOnlyStrings.Add("5"); readOnlyStrings.Remove("1"); readOnlyStrings[0] = "1.1"; 

While you cannot modify the data within the readOnlyStrings object, you can point this object to refer to a different object of type IList<string>, for example:

 readOnlyStrings = new List<string>(); 

On the other hand, if you add, modify, or delete elements from the original strings object, the changes will be reflected in the new readOnlyStrings object. For example, the following code creates a List<string>, populates it, and then creates a read-only object readOnlyStrings from this original List<string> object. Next, the readOnlyStrings object elements are displayed; the original List<string> object is modified and then the readOnlyStrings object elements are again displayed. Notice that they have changed.

 // Create and populate a List of strings. List<string> strings = new List<string>( ); strings.Add("1"); strings.Add("2"); strings.Add("3"); strings.Add("4"); // Create a read-only strings List. IList<string> readOnlyStrings = strings.AsReadOnly( ); // Display them. foreach (string s in readOnlyStrings)     Console.WriteLine(s); // Change the value in the original array. strings[0] = "one"; strings[1] = null; // Display them again. Console.WriteLine( ); foreach (string s in readOnlyStrings)     Console.WriteLine(s); 

This code outputs the following:

 1 2 3 4 one          The null value 3 4 

For an alternate method to making read-only collections, see Recipe 4.9.

See Also

See the "Array Class," "List<T> Class," "IList<T> Interface," and "AsReadOnly Method" topics in the MSDN documentation.



C# Cookbook
Secure Programming Cookbook for C and C++: Recipes for Cryptography, Authentication, Input Validation & More
ISBN: 0596003943
EAN: 2147483647
Year: 2004
Pages: 424

flylib.com © 2008-2017.
If you may any questions please contact us: flylib@qtcs.net