マルチスレッド アクセスが必要な場合は、値型のプロパティでロックを使用しています。また、特に複数のプロジェクトで有用になりつつある私のライブラリ コードでは、適切なアクセス修飾子を適用することにもっと熱心になるつもりでした。私はいくつかのコードを書きましたが、プロパティのさまざまな戦略とそれらがラップするメンバー変数のロックについてコメントを要求したいと思います。ありがとう。
システムを使用する;
公開授業 プログラム
{
static void Main(string[] args)
{
SomeValueType svt = new SomeValueType();
SomeReferenceType srt = new SomeReferenceType();
PermissionsAndLocking p = 新しい PermissionsAndLocking(5, svt, srt);
//無効。
//pX = 6;
//無効
//p.Svt = new SomeValueType();
//無効
//p.Svt.X = 1;
//有効ですが、Svt は値型であるため、p.Svt のコピーを変更します。
SomeValueType svt2 = p.Svt;
svt2.X = 7;
//無効
//p.Srt = new SomeReferenceType();
//有効です。p.Srt のメンバー データを変更します。
p.Srt.X = 8;
SomeReferenceType srt2 = p.Srt;
srt2.X = 9;
Console.WriteLine("任意のキーを押してください。");
Console.Read();
}
}
パブリック クラス PermissionsAndLocking
{
//_x はクラス外では変更できません。
//_x は、アクセスされている「同時に」変更することはできませんか???
プライベート読み取り専用オブジェクト _xLock = new object();
プライベート int _x;
public int X
{
得る
{
ロック (_xLock)
{
_x を返します。
}
}
プライベートセット
{
ロック (_xLock)
{
_x = 値;
}
}
}
//_svt とそのメンバーをクラス外に割り当てることはできません。
//_svt は、アクセスされている「と同時に」変更することはできません。
プライベート読み取り専用オブジェクト _svtLock = new object();
プライベート SomeValueType _svt;
public SomeValueType Svt
{
得る
{
ロック (_svtLock)
{
_svt を返します。
}
}
プライベートセット
{
ロック (_svtLock)
{
_svt = 値;
}
}
}
//private on set は = に対して機能しますが、メンバー データは引き続き操作できます...
//参照が返され、後でアクセスできるため、ロックは完了していません???
プライベート読み取り専用オブジェクト _srtLock = new object();
プライベート SomeReferenceType _srt;
public SomeReferenceType Srt
{
得る
{
ロック (_srtLock)
{
_srt を返します。
}
}
プライベートセット
{
ロック (_srtLock)
{
_srt = 値;
}
}
}
public PermissionsAndLocking(int x, SomeValueType svt, SomeReferenceType srt)
{
_x = x;
_svt = svt;
_srt = srt;
}
}
public struct SomeValueType
{
public int X;
}
パブリック クラス SomeReferenceType
{
public int X;
}