我可以在运行时锁定/解锁字段或对象以防写入吗?换句话说就像在运行时临时将对象更改为只读...
例如:
int x = 5; // x is 5
LockObject(x);
x = 7; // no change
UnlockObject(x);
x = 10; // x is 10
如果没有,你能给我一些可能的解决方案吗?
答案 0 :(得分:6)
您可以使用访问器来执行此操作...
public class X
{
private bool locked = false;
private int lockedVar;
public int LockedVar
{
get { return lockedVar; }
set { if (!locked) lockedVar = value; }
}
public void LockObject() { locked = true; }
public void UnlockObject() { locked = false; }
}
答案 1 :(得分:1)
将其包装在属性中,然后使用布尔标志作为“锁定”。
您还可以使用结构来处理这种类型的逻辑。
public struct LockableInt
{
private int _value;
public bool Locked;
public void Lock(bool locked) {Locked = locked;}
public int Value
{
get
{ return _value; }
set
{ if (!Locked) _value = value; }
}
public override string ToString()
{
return _value.ToString();
}
}
示例客户端代码:
public static void RunSnippet()
{
LockableInt li = new LockableInt();
li.Value = 5;
Console.WriteLine(li.ToString());
li.Lock(true);
li.Value = 6;
Console.WriteLine(li.ToString());
li.Lock(false);
li.Value = 7;
Console.WriteLine(li.ToString());
}
输出:
5 五 7 按任意键继续......
答案 2 :(得分:0)
谢谢大家的帮助。这是一个更通用的替代方案 我已经决定使用冻结/解冻会更方便,因为在多线程编程的上下文中存在锁定/解锁。
public class FreezeableValue<T>
{
private bool frozen;
private T value;
public FreezeableValue()
{
frozen = false;
}
public FreezeableValue(T value)
{
this.value = value;
frozen = false;
}
public void Freeze(bool frozen)
{
this.frozen = frozen;
}
public T Value
{
get { return value; }
set
{
if (!frozen) this.value = value;
}
}
}