当需要多线程访问时,我一直在对值类型属性使用锁定。此外,我一直希望更加努力地应用适当的访问修饰符,尤其是在我的库代码中,这些代码开始在多个项目中变得有用。我已经编写了一些代码,并希望对其中的各种策略进行评论,以获取属性并锁定它们包装的成员变量。谢谢。
使用系统;
公开课程序
{
静态无效主要(字符串 [] 参数)
{
SomeValueType svt = new SomeValueType();
SomeReferenceType srt = new SomeReferenceType();
PermissionsAndLocking p = new PermissionsAndLocking(5, svt, srt);
//无效的。
//pX = 6;
//无效的
//p.Svt = new SomeValueType();
//无效的
//p.Svt.X = 1;
//有效,但会更改p.Svt的副本,因为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;
公共诠释 X
{
得到
{
锁 (_xLock)
{
返回_x;
}
}
私人集
{
锁 (_xLock)
{
_x = 值;
}
}
}
//_svt 及其成员不能分配给类外。
//_svt 不能在被访问的“同时”改变。
私有只读对象 _svtLock = new object();
私人 SomeValueType _svt;
公共 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;
}
}
公共结构 SomeValueType
{
公共诠释 X;
}
公共类 SomeReferenceType
{
公共诠释 X;
}