簡體   English   中英

如何在C#中在運行時鎖定/解鎖字段?

[英]How to lock/unlock a field at runtime in C#?

我可以在運行時鎖定/解鎖字段或對象以防寫入嗎? 換句話說,例如在運行時將對象臨時更改為只讀...

例如:

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

如果不能,您能給我一些可行的解決方案嗎?

您可以使用訪問器來執行此操作...

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

將其包裝在屬性中,然后使用布爾標志作為“鎖”。

您也可以使用結構來處理這種類型的邏輯。

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 5 7按任意鍵繼續...

謝謝大家的幫助。 這是一個更通用的選擇。
我已經決定使用凍結/解凍會更方便,因為在多線程編程的上下文中存在鎖定/解鎖。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM