ReadOnlyCollection
This makes an array or List
read-only. With this type from System.Collections.ObjectModel
, we provide a collection of elements that cannot be changed.
In programs, an immutable collection can be used with less copying—we do not need to worry about it being modified. This can make programs simpler and easier to reason about.
In this program, a list of ints is created, and then the ReadOnlyCollection
constructor is used with that List
as an argument.
ReadOnlyCollection
constructor, a reference to the argument is stored as an IList
reference field.ReadOnlyCollection
constructor, no elements are copied. The constructor is fast.ReadOnlyCollection
using the foreach
-loop. A for
-loop is also possible with the Count
property and indexer.CopyTo
provides a way to copy the elements to an array. You must allocate the array yourself.using System; using System.Collections.Generic; using System.Collections.ObjectModel; class Program { static void Main() { List<int> list = new List<int>(); list.Add(1); list.Add(3); list.Add(5); // Constructor. ReadOnlyCollection<int> read = new ReadOnlyCollection<int>(list); // Loop over ReadOnlyCollection. foreach (int value in read) { Console.WriteLine("read: {0}", value); } // Copy ReadOnlyCollection to an array. int[] array = new int[3]; read.CopyTo(array, 0); // Display array. foreach (int value in array) { Console.WriteLine("array: {0}", value); } // Use methods on ReadOnlyCollection. int count = read.Count; bool contains = read.Contains(-1); int index = read.IndexOf(3); Console.WriteLine("{0}, {1}, {2}", count, contains, index); } }read: 1 read: 3 read: 5 array: 1 array: 3 array: 5 3, False, 1
With ReadOnlyCollection
, the collection itself is read-only. This means that if you have a ReadOnlyCollection
of int
, nothing can be changed.
StringBuilder
objects by accessing their methods.StringBuilder
references themselves are read-only, but the memory pointed to by the references are still mutable.using System; using System.Collections.ObjectModel; using System.Text; class Program { static void Main() { // Set up the ReadOnlyCollection. StringBuilder[] array = new StringBuilder[1]; array[0] = new StringBuilder(); var read = new ReadOnlyCollection<StringBuilder>(array); // Now we change an object pointed to in a ReadOnlyCollection. read[0].Append("Dot").Append("Net").Append("Perls"); Console.WriteLine(read[0]); } }DotNetPerls
Read-only status is not transferred to other references. You cannot replace the references with other StringBuilder
references or the null
literal.
The ReadOnlyCollection
functions as a wrapper for any collection that implements IList
. It adds a level of indirection that reduces possible changes.