Creating a Read-Only Array or List&ltT&gt






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.



 Python   SQL   Java   php   Perl 
 game development   web development   internet   *nix   graphics   hardware 
 telecommunications   C++ 
 Flash   Active Directory   Windows 

kwhitefoot
kwhitefoot 6 years, 1 month ago #
Why couldn't Microsoft have mentioned this on their help pages about the readonly qualifier? Would have saved me ten minutes of web searching.
wicked-creature
wicked creature 6 years, 1 month ago #
Because Microsoft help and support sucks. Try to contact them - you will just be lead around in circles... AND THEY SEND SPAM TO YOUR HOTMAIL-BOX, ALSO IF IT IS NOT ADRESSED TO YOU!