次の方法で共有


ReadOnlyCollectionBase クラス

厳密に型指定された読み取り専用コレクションの抽象 (Visual Basic では MustInherit) 基本クラスを提供します。

この型のすべてのメンバの一覧については、ReadOnlyCollectionBase メンバ を参照してください。

System.Object
   System.Collections.ReadOnlyCollectionBase
      派生クラス

<Serializable>
MustInherit Public Class ReadOnlyCollectionBase   Implements ICollection, IEnumerable
[C#]
[Serializable]
public abstract class ReadOnlyCollectionBase : ICollection,   IEnumerable
[C++]
[Serializable]
public __gc __abstract class ReadOnlyCollectionBase : public   ICollection, IEnumerable
[JScript]
public
   Serializable
abstract class ReadOnlyCollectionBase implements   ICollection, IEnumerable

スレッドセーフ

この型の public static (Visual Basic では Shared) メンバは、マルチスレッド操作に対して安全です。インスタンス メンバがスレッド セーフになるかどうかは保証されていません。

この実装は、 ReadOnlyCollectionBase 用の同期された (スレッド セーフな) ラッパーは提供しませんが、派生クラスでは、 SyncRoot プロパティを使用して、同期した ReadOnlyCollectionBase を独自に作成できます。

コレクションの列挙処理は、本質的にはスレッド セーフな処理ではありません。コレクションが同期されている場合でも、他のスレッドがそのコレクションを変更する可能性はあり、そのような状況が発生すると列挙子は例外をスローします。列挙処理を確実にスレッド セーフに行うには、列挙中にコレクションをロックするか、他のスレッドによって行われた変更によってスローされる例外をキャッチします。

解説

ReadOnlyCollectionBase インスタンスは、常に読み取り専用です。このクラスの変更可能バージョンについては、 CollectionBase のトピックを参照してください。

実装時の注意:

この基本クラスは、厳密に型指定された読み取り専用のカスタム コレクションを簡単に作成できるように提供されています。実装する場合は、独自のクラスを作成するのではなく、この基本クラスを拡張してください。この基本クラスのメンバはプロテクト メンバであり、派生クラスからだけ使用できるようになっています。

このクラスは、基になるコレクションを InnerList プロパティを通じて利用できるようにします。これは、 ReadOnlyCollectionBase から直接派生したクラスによる使用だけを想定したものです。派生したクラスでは、それ自体のユーザーが基になるコレクションを変更できないことを保証する必要があります。

使用例

[Visual Basic, C#, C++] ReadOnlyCollectionBase クラスを実装するコード例を次に示します。

 
Imports System
Imports System.Collections

Public Class ROCollection
   Inherits ReadOnlyCollectionBase

   Public Sub New(sourceList As IList)
      InnerList.AddRange(sourceList)
   End Sub 'New

   Default Public ReadOnly Property Item(index As Integer) As [Object]
      Get
         Return InnerList(index)
      End Get
   End Property

   Public Function IndexOf(value As [Object]) As Integer
      Return InnerList.IndexOf(value)
   End Function 'IndexOf

   Public Function Contains(value As [Object]) As Boolean
      Return InnerList.Contains(value)
   End Function 'Contains

End Class 'ROCollection 


Public Class SamplesCollectionBase

   Public Shared Sub Main()

      ' Create an ArrayList.
      Dim myAL As New ArrayList()
      myAL.Add("red")
      myAL.Add("blue")
      myAL.Add("yellow")
      myAL.Add("green")
      myAL.Add("orange")
      myAL.Add("purple")

      ' Create a new ROCollection that contains the elements in myAL.
      Dim myCol As New ROCollection(myAL)

      ' Display the contents of the collection using the enumerator.
      Console.WriteLine("Contents of the collection (using enumerator):")
      PrintIndexAndValues(myCol)

      ' Search the collection with Contains and IndexOf.
      Console.WriteLine("Contains yellow: {0}", myCol.Contains("yellow"))
      Console.WriteLine("orange is at index {0}.", myCol.IndexOf("orange"))
      Console.WriteLine()

      ' Display the contents of the collection using the Count property and the Item property.
      Console.WriteLine("Contents of the collection (using Count and Item):")
      PrintIndexAndValues2(myCol)

   End Sub 'Main

   Public Shared Sub PrintIndexAndValues(myCol As ROCollection)
      Dim i As Integer = 0
      Dim myEnumerator As System.Collections.IEnumerator = myCol.GetEnumerator()
      While myEnumerator.MoveNext()
         Console.WriteLine("   [{0}]:   {1}", i, myEnumerator.Current)
         i += 1
      End While
      Console.WriteLine()
   End Sub 'PrintIndexAndValues

   Public Shared Sub PrintIndexAndValues2(myCol As ROCollection)
      Dim i As Integer
      For i = 0 To myCol.Count - 1
         Console.WriteLine("   [{0}]:   {1}", i, myCol(i))
      Next i
      Console.WriteLine()
   End Sub 'PrintIndexAndValues2

End Class 'SamplesCollectionBase 


'This code produces the following output.
'
'Contents of the collection (using enumerator):
'   [0]:   red
'   [1]:   blue
'   [2]:   yellow
'   [3]:   green
'   [4]:   orange
'   [5]:   purple
'
'Contains yellow: True
'orange is at index 4.
'
'Contents of the collection (using Count and Item):
'   [0]:   red
'   [1]:   blue
'   [2]:   yellow
'   [3]:   green
'   [4]:   orange
'   [5]:   purple


[C#] 
using System;
using System.Collections;

public class ROCollection : ReadOnlyCollectionBase  {

   public ROCollection( IList sourceList )  {
      InnerList.AddRange( sourceList );
   }

   public Object this[ int index ]  {
      get  {
         return( InnerList[index] );
      }
   }

   public int IndexOf( Object value )  {
      return( InnerList.IndexOf( value ) );
   }

   public bool Contains( Object value )  {
      return( InnerList.Contains( value ) );
   }

}


public class SamplesCollectionBase  {

   public static void Main()  {

      // Create an ArrayList.
      ArrayList myAL = new ArrayList();
      myAL.Add( "red" );
      myAL.Add( "blue" );
      myAL.Add( "yellow" );
      myAL.Add( "green" );
      myAL.Add( "orange" );
      myAL.Add( "purple" );
 
      // Create a new ROCollection that contains the elements in myAL.
      ROCollection myCol = new ROCollection( myAL );

      // Display the contents of the collection using the enumerator.
      Console.WriteLine( "Contents of the collection (using enumerator):" );
      PrintIndexAndValues( myCol );

      // Search the collection with Contains and IndexOf.
      Console.WriteLine( "Contains yellow: {0}", myCol.Contains( "yellow" ) );
      Console.WriteLine( "orange is at index {0}.", myCol.IndexOf( "orange" ) );
      Console.WriteLine();

      // Display the contents of the collection using the Count property and the Item property.
      Console.WriteLine( "Contents of the collection (using Count and Item):" );
      PrintIndexAndValues2( myCol );

   }
 
   public static void PrintIndexAndValues( ROCollection myCol )  {
      int i = 0;
      System.Collections.IEnumerator myEnumerator = myCol.GetEnumerator();
      while ( myEnumerator.MoveNext() )
         Console.WriteLine( "   [{0}]:   {1}", i++, myEnumerator.Current );
      Console.WriteLine();
   }

   public static void PrintIndexAndValues2( ROCollection myCol )  {
      for ( int i = 0; i < myCol.Count; i++ )
         Console.WriteLine( "   [{0}]:   {1}", i, myCol[i] );
      Console.WriteLine();
   }

}


/* 
This code produces the following output.

Contents of the collection (using enumerator):
   [0]:   red
   [1]:   blue
   [2]:   yellow
   [3]:   green
   [4]:   orange
   [5]:   purple

Contains yellow: True
orange is at index 4.

Contents of the collection (using Count and Item):
   [0]:   red
   [1]:   blue
   [2]:   yellow
   [3]:   green
   [4]:   orange
   [5]:   purple

*/


[C++] 
#using <mscorlib.dll>
using namespace System;
using namespace System::Collections;

public __gc class ROCollection : public ReadOnlyCollectionBase  {

public:
    ROCollection( IList* sourceList )  {
        InnerList->AddRange( sourceList );
    }

public:
    __property Object* get_Item( int index )  {
        return( InnerList->Item[index] );
    }

public:
    int IndexOf( Object* value )  {
        return( InnerList->IndexOf( value ) );
    }

public:
    bool Contains( Object* value )  {
        return( InnerList->Contains( value ) );
    }

};

static void PrintIndexAndValues( ROCollection* myCol )  {
    int i = 0;
    System::Collections::IEnumerator* myEnumerator = myCol->GetEnumerator();
    while ( myEnumerator->MoveNext() )
        Console::WriteLine( S"   [{0}]:   {1}", __box(i++), myEnumerator->Current );
    Console::WriteLine();
}

static void PrintIndexAndValues2( ROCollection* myCol )  {
    for ( int i = 0; i < myCol->Count; i++ )
        Console::WriteLine( S"   [{0}]:   {1}", __box(i), myCol->Item[i] );
    Console::WriteLine();
}

int main()  {

    // Create an ArrayList.
    ArrayList* myAL = new ArrayList();
    myAL->Add( S"red" );
    myAL->Add( S"blue" );
    myAL->Add( S"yellow" );
    myAL->Add( S"green" );
    myAL->Add( S"orange" );
    myAL->Add( S"purple" );

    // Create a new ROCollection that contains the elements in myAL.
    ROCollection* myCol = new ROCollection( myAL );

    // Display the contents of the collection using the enumerator.
    Console::WriteLine( S"Contents of the collection (using enumerator):" );
    PrintIndexAndValues( myCol );

    // Search the collection with Contains and IndexOf.
    Console::WriteLine( S"Contains yellow: {0}", __box(myCol->Contains( S"yellow" )));
    Console::WriteLine( S"orange is at index {0}.", __box(myCol->IndexOf( S"orange" )));
    Console::WriteLine();

    // Display the contents of the collection using the Count property and the Item property.
    Console::WriteLine( S"Contents of the collection (using Count and Item):" );
    PrintIndexAndValues2( myCol );

}

/* 
This code produces the following output.

Contents of the collection (using enumerator):
   [0]:   red
   [1]:   blue
   [2]:   yellow
   [3]:   green
   [4]:   orange
   [5]:   purple

Contains yellow: True
orange is at index 4.

Contents of the collection (using Count and Item):
   [0]:   red
   [1]:   blue
   [2]:   yellow
   [3]:   green
   [4]:   orange
   [5]:   purple

*/

[JScript] JScript のサンプルはありません。Visual Basic、C#、および C++ のサンプルを表示するには、このページの左上隅にある言語のフィルタ ボタン 言語のフィルタ をクリックします。

必要条件

名前空間: System.Collections

プラットフォーム: Windows 98, Windows NT 4.0, Windows Millennium Edition, Windows 2000, Windows XP Home Edition, Windows XP Professional, Windows Server 2003 ファミリ

アセンブリ: Mscorlib (Mscorlib.dll 内)

参照

ReadOnlyCollectionBase メンバ | System.Collections 名前空間 | System.Collections.ArrayList | CollectionBase