如何在C#中在运行时锁定/解锁字段?

时间:2010-01-15 16:56:44

标签: c# locking readonly

我可以在运行时锁定/解锁字段或对象以防写入吗?换句话说就像在运行时临时将对象更改为只读...

例如:

int x = 5; // x is 5  
LockObject(x);  
x = 7; // no change  
UnlockObject(x);  
x = 10; // x is 10

如果没有,你能给我一些可能的解决方案吗?

3 个答案:

答案 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;
    }
 }
}