Home
Map
ReadOnlyCollectionUse the ReadOnlyCollection type from System.Collections.ObjectModel.
C#
This page was last reviewed on Mar 14, 2023.
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.
Array.AsReadOnly
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.
First example. In this program, a list of ints is created, and then the ReadOnlyCollection constructor is used with that List as an argument.
Detail Inside the ReadOnlyCollection constructor, a reference to the argument is stored as an IList reference field.
IList
Info In the ReadOnlyCollection constructor, no elements are copied. The constructor is fast.
Constructor
Tip You can loop over the ReadOnlyCollection using the foreach-loop. A for-loop is also possible with the Count property and indexer.
Tip 2 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
Example 2. With ReadOnlyCollection, the collection itself is read-only. This means that if you have a ReadOnlyCollection of int, nothing can be changed.
int, uint
Here You can still change the individual StringBuilder objects by accessing their methods.
Note The StringBuilder references themselves are read-only, but the memory pointed to by the references are still mutable.
StringBuilder
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
A note. Read-only status is not transferred to other references. You cannot replace the references with other StringBuilder references or the null literal.
Summary. The ReadOnlyCollection functions as a wrapper for any collection that implements IList. It adds a level of indirection that reduces possible changes.
Dot Net Perls is a collection of tested code examples. Pages are continually updated to stay current, with code correctness a top priority.
Sam Allen is passionate about computer languages. In the past, his work has been recommended by Apple and Microsoft and he has studied computers at a selective university in the United States.
This page was last updated on Mar 14, 2023 (edit).
Home
Changes
© 2007-2024 Sam Allen.