Recipe 5.17. Creating a Read-Only Array or List<T>ProblemYou need a way to create a read-only Array or List<T>, where the Array or List<T> itself is read-only. SolutionUse 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); DiscussionThe 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 AlsoSee the "Array Class," "List<T> Class," "IList<T> Interface," and "AsReadOnly Method" topics in the MSDN documentation. |