C#のArray.SyncRootプロパティとは?役割と使い方を実例付きで解説
C#のArray.SyncRootプロパティは、Arrayへのアクセスを同期(スレッド間での排他制御)するために使用できるオブジェクトを取得するためのプロパティです。配列を内部に持つクラスでも、このSyncRootプロパティを活用することで、独自の同期処理を実装できます。
なぜSyncRootが必要なのか
コレクションを列挙(foreachなどによる走査)する処理は、基本的にスレッドセーフではありません。たとえコレクションが同期されていたとしても、列挙中に別のスレッドがコレクションを変更する可能性があり、その場合、列挙子(enumerator)は例外をスローしてしまいます。
この問題を回避するには、列挙を行う間、コレクションをロックして他のスレッドからのアクセスを防ぐ必要があります。ここで役立つのがSyncRootプロパティです。SyncRootが返すオブジェクトに対してlock文を使うことで、安全に排他制御を行えます。
Array.SyncRootの使用例
以下は、Array.SyncRootプロパティを使った実際のコード例です。
using System;
using System.Collections.Generic;
using System.Linq;
class Program {
static void Main() {
Array arr = new int[] { 23, 11, 32, 18, 87 };
lock(arr.SyncRoot) {
foreach (Object val in arr)
Console.WriteLine(val);
}
}
}実行結果
23 11 32 18 87
コードのポイント
上記の例では、次のようにlockブロック内でSyncRootを使い、配列への排他アクセスを実現しています。
lock(arr.SyncRoot)
このように書くことで、foreachによる配列の列挙中に他のスレッドが同じオブジェクトへアクセスしようとした場合、lockが解除されるまで待機するようになります。マルチスレッド環境で配列やコレクションを安全に扱う際には、SyncRootを利用したロック処理を検討するとよいでしょう。
-
C#のBitArrayクラスでCountプロパティを使って要素数を取得する方法
C#のBitArrayクラスにおけるCountプロパティとは?C#のBitArrayクラスは、ビット値(true/false)のコレクションを管理するためのクラスです。このクラスには、Countプロパティが用意されており、これを使うことでBitArrayに含まれる要素(ビット)の総数を簡単に取得できます。なお、BitArrayクラスのCountプロパティは、Lengthプロパティと同じ値を返します。どちらを使用しても要素数は同じになります。BitArrayクラスのインスタンスを作成するまずは、BitArrayクラスのインスタンスを作成しましょう。以下の例では、10個の要素を持つBitArray
-
C#のSortedListクラスのCapacityプロパティとは?意味と使い方を解説
C#のSortedListクラスにおけるCapacityプロパティとはSortedListクラスのCapacity(容量)プロパティは、SortedListが保持できる要素数の最大サイズを示すプロパティです。つまり、内部的に確保されている配列が格納できる要素の総数を表しています。なお、SortedListの既定の容量(デフォルト値)は16に設定されています。要素を追加していき容量を超えると、容量は自動的に拡張される仕組みになっています。以下のコードを実行すると、C#でSortedListクラスのCapacityプロパティを実際に確認できます。コード例using System; using Sy