ReadOnlyCollection ジェネリック クラス
アセンブリ: mscorlib (mscorlib.dll 内)

<SerializableAttribute> _ <ComVisibleAttribute(False)> _ Public Class ReadOnlyCollection(Of T) Implements IList(Of T), ICollection(Of T), _ IEnumerable(Of T), IList, ICollection, _ IEnumerable
[SerializableAttribute] [ComVisibleAttribute(false)] public class ReadOnlyCollection<T> : IList<T>, ICollection<T>, IEnumerable<T>, IList, ICollection, IEnumerable
[SerializableAttribute] [ComVisibleAttribute(false)] generic<typename T> public ref class ReadOnlyCollection : IList<T>, ICollection<T>, IEnumerable<T>, IList, ICollection, IEnumerable

ReadOnlyCollection ジェネリック クラスのインスタンスは、常に読み取り専用です。読み取り専用のコレクションは、コレクションの変更を防ぐラッパーがコレクションに組み込まれているに過ぎません。したがって、基になっているコレクションで変更が加えられた場合、読み取り専用のコレクションでもその内容が反映されます。このクラスの変更可能バージョンについては、Collection のトピックを参照してください。
実装時の注意 この基本クラスは、汎用的な読み取り専用のカスタム コレクションを簡単に作成できるように提供されています。実装する場合は、独自のクラスを作成するのではなく、この基本クラスを拡張してください。
ReadOnlyCollection クラスのいくつかのメンバの使用例を次に示します。このコード例では、文字列の List を作成し、4 つの恐竜の名前を追加します。次に、ReadOnlyCollection のリストをラップします。
Count、Contains、Item、および System.Collections.IList.IndexOf の各メンバの例を示した後で、新しい項目を List に追加して ReadOnlyCollection の内容を表示することによって、ReadOnlyCollection が元の List の単なるラッパーであることを示します。
最後に、コレクションよりも大きい配列を作成し、CopyTo メソッドを使用してコレクションの要素を配列の中央部に挿入します。
Imports System Imports System.Collections.Generic Imports System.Collections.ObjectModel Public Class Example Public Shared Sub Main() Dim dinosaurs As New List(Of String) dinosaurs.Add("Tyrannosaurus") dinosaurs.Add("Amargasaurus") dinosaurs.Add("Deinonychus") dinosaurs.Add("Compsognathus") Dim readOnlyDinosaurs As _ New ReadOnlyCollection(Of String)(dinosaurs) Console.WriteLine() For Each dinosaur As String In readOnlyDinosaurs Console.WriteLine(dinosaur) Next Console.WriteLine(vbLf & "Count: {0}", _ readOnlyDinosaurs.Count) Console.WriteLine(vbLf & "Contains(""Deinonychus""): {0}", _ readOnlyDinosaurs.Contains("Deinonychus")) Console.WriteLine(vbLf & _ "readOnlyDinosaurs(3): {0}", readOnlyDinosaurs(3)) Console.WriteLine(vbLf & "IndexOf(""Compsognathus""): {0}", _ readOnlyDinosaurs.IndexOf("Compsognathus")) Console.WriteLine(vbLf & "Insert into the wrapped List:") Console.WriteLine("Insert(2, ""Oviraptor"")") dinosaurs.Insert(2, "Oviraptor") Console.WriteLine() For Each dinosaur As String In readOnlyDinosaurs Console.WriteLine(dinosaur) Next Dim dinoArray(readOnlyDinosaurs.Count + 1) As String readOnlyDinosaurs.CopyTo(dinoArray, 1) Console.WriteLine(vbLf & "Copied array has {0} elements:", _ dinoArray.Length) For Each dinosaur As String In dinoArray Console.WriteLine("""{0}""", dinosaur) Next End Sub End Class ' This code example produces the following output: ' 'Tyrannosaurus 'Amargasaurus 'Deinonychus 'Compsognathus ' 'Count: 4 ' 'Contains("Deinonychus"): True ' 'readOnlyDinosaurs(3): Compsognathus ' 'IndexOf("Compsognathus"): 3 ' 'Insert into the wrapped List: 'Insert(2, "Oviraptor") ' 'Tyrannosaurus 'Amargasaurus 'Oviraptor 'Deinonychus 'Compsognathus ' 'Copied array has 7 elements: '"" '"Tyrannosaurus" '"Amargasaurus" '"Oviraptor" '"Deinonychus" '"Compsognathus" '""
using System; using System.Collections.Generic; using System.Collections.ObjectModel; public class Example { public static void Main() { List<string> dinosaurs = new List<string>(); dinosaurs.Add("Tyrannosaurus"); dinosaurs.Add("Amargasaurus"); dinosaurs.Add("Deinonychus"); dinosaurs.Add("Compsognathus"); ReadOnlyCollection<string> readOnlyDinosaurs = new ReadOnlyCollection<string>(dinosaurs); Console.WriteLine(); foreach( string dinosaur in readOnlyDinosaurs ) { Console.WriteLine(dinosaur); } Console.WriteLine("\nCount: {0}", readOnlyDinosaurs.Count); Console.WriteLine("\nContains(\"Deinonychus\"): {0}", readOnlyDinosaurs.Contains("Deinonychus")); Console.WriteLine("\nreadOnlyDinosaurs[3]: {0}", readOnlyDinosaurs[3]); Console.WriteLine("\nIndexOf(\"Compsognathus\"): {0}", readOnlyDinosaurs.IndexOf("Compsognathus")); Console.WriteLine("\nInsert into the wrapped List:"); Console.WriteLine("Insert(2, \"Oviraptor\")"); dinosaurs.Insert(2, "Oviraptor"); Console.WriteLine(); foreach( string dinosaur in readOnlyDinosaurs ) { Console.WriteLine(dinosaur); } string[] dinoArray = new string[readOnlyDinosaurs.Count + 2]; readOnlyDinosaurs.CopyTo(dinoArray, 1); Console.WriteLine("\nCopied array has {0} elements:", dinoArray.Length); foreach( string dinosaur in dinoArray ) { Console.WriteLine("\"{0}\"", dinosaur); } } } /* This code example produces the following output: Tyrannosaurus Amargasaurus Deinonychus Compsognathus Count: 4 Contains("Deinonychus"): True readOnlyDinosaurs[3]: Compsognathus IndexOf("Compsognathus"): 3 Insert into the wrapped List: Insert(2, "Oviraptor") Tyrannosaurus Amargasaurus Oviraptor Deinonychus Compsognathus Copied array has 7 elements: "" "Tyrannosaurus" "Amargasaurus" "Oviraptor" "Deinonychus" "Compsognathus" "" */
using namespace System; using namespace System::Collections::Generic; using namespace System::Collections::ObjectModel; void main() { List<String^>^ dinosaurs = gcnew List<String^>(); dinosaurs->Add("Tyrannosaurus"); dinosaurs->Add("Amargasaurus"); dinosaurs->Add("Deinonychus"); dinosaurs->Add("Compsognathus"); ReadOnlyCollection<String^>^ readOnlyDinosaurs = gcnew ReadOnlyCollection<String^>(dinosaurs); Console::WriteLine(); for each(String^ dinosaur in readOnlyDinosaurs ) { Console::WriteLine(dinosaur); } Console::WriteLine("\nCount: {0}", readOnlyDinosaurs->Count); Console::WriteLine("\nContains(\"Deinonychus\"): {0}", readOnlyDinosaurs->Contains("Deinonychus")); Console::WriteLine("\nreadOnlyDinosaurs[3]: {0}", readOnlyDinosaurs[3]); Console::WriteLine("\nIndexOf(\"Compsognathus\"): {0}", readOnlyDinosaurs->IndexOf("Compsognathus")); Console::WriteLine("\nInsert into the wrapped List:"); Console::WriteLine("Insert(2, \"Oviraptor\")"); dinosaurs->Insert(2, "Oviraptor"); Console::WriteLine(); for each( String^ dinosaur in readOnlyDinosaurs ) { Console::WriteLine(dinosaur); } array<String^>^ dinoArray = gcnew array<String^>(readOnlyDinosaurs->Count + 2); readOnlyDinosaurs->CopyTo(dinoArray, 1); Console::WriteLine("\nCopied array has {0} elements:", dinoArray->Length); for each( String^ dinosaur in dinoArray ) { Console::WriteLine("\"{0}\"", dinosaur); } } /* This code example produces the following output: Tyrannosaurus Amargasaurus Deinonychus Compsognathus Count: 4 Contains("Deinonychus"): True readOnlyDinosaurs[3]: Compsognathus IndexOf("Compsognathus"): 3 Insert into the wrapped List: Insert(2, "Oviraptor") Tyrannosaurus Amargasaurus Oviraptor Deinonychus Compsognathus Copied array has 7 elements: "" "Tyrannosaurus" "Amargasaurus" "Oviraptor" "Deinonychus" "Compsognathus" "" */

System.Collections.ObjectModel.ReadOnlyCollection

この型の public static (Visual Basic では Shared) メンバは、スレッド セーフです。すべてのインスタンス メンバがスレッド セーフになるかどうかは保証されていません。
コレクションが変更されない限り、ReadOnlyCollection では、複数の読み込み操作が同時に発生しても問題ありません。ただし、コレクションの列挙処理は、本質的にはスレッド セーフな処理ではありません。すべての列挙処理が終わるまでコレクションをロックすることにより、列挙処理でのスレッド セーフを確保できます。コレクションに対し複数のスレッドがアクセスして読み取りや書き込みを行うことができるようにするには、独自に同期化を実装する必要があります。

Windows 98, Windows 2000 SP4, Windows CE, Windows Millennium Edition, Windows Mobile for Pocket PC, Windows Mobile for Smartphone, Windows Server 2003, Windows XP Media Center Edition, Windows XP Professional x64 Edition, Windows XP SP2, Windows XP Starter Edition
開発プラットフォームの中には、.NET Framework によってサポートされていないバージョンがあります。サポートされているバージョンについては、「システム要件」を参照してください。


- ReadOnlyCollection ジェネリック クラスのページへのリンク