c# - 锁定对象以防止任何数据更改

标签 c#

这有点奇怪......

假设我有以下类(class):

public class Wibble
{
  public string Foo {get;set;}
  public string Bar {get;set;}
}

此类用于更新/更改 Foo 和 Bar 的值的过程。但是,在过程中的某个点之后,我想“锁定”实例以防止进行任何更改。所以问题是如何最好地做到这一点?

某种解决方案是这样的:

public class Wibble
{
  private string _foo;
  private string _bar;

  public bool Locked {get; set;}

  public string Foo
  {
    get
    {
      return this._foo
    }
    set
    {
        if (this.Locked)
        {
          throw new ObjectIsLockedException()
        }

        this._foo = value;
    }
  }

  public string Bar
  {
    get
    {
      return this._bar
    }
    set
    {
        if (this.Locked)
        {
          throw new ObjectIsLockedException()
        }

        this._bar = value;
    }
  }
}

然而,这似乎有点不雅。

想要这样做的原因是我有一个应用程序框架,该框架使用使用该类的外部开发的插件。 Wibble 类被传递到插件中,但是其中一些永远不会更改内容,有些可以。这背后的意图是捕捉开发集成问题而不是运行时生产问题。将对象“锁定”允许快速识别未按指定编码的插件。

最佳答案

我已经实现了类似于您的锁定模式的东西,但也有一个由包含实际类数据的私有(private)子类实现的只读接口(interface),这样您就可以传递显然是只读 View 的内容数据并且不能向上转换为原始的“可变版本”。锁定纯粹是为了防止数据提供者在提供不可变 View 后进行进一步更改。

正如您所指出的,它运行良好,但有点笨拙。我认为拥有可变的“Builder”对象然后可以生成不可变的快照实际上更干净。想想 StringBuilder 和 String。这意味着您复制了一些属性代码并且必须编写例程来进行复制,但在我看来,这比在每个属性上都有一个写锁要简单得多。在编译时也很明显,快照应该是只读的,Builder 的用户不能修改它之前创建的快照。

关于c# - 锁定对象以防止任何数据更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6139308/

相关文章:

c# - 如果 C# async/await 仍然等待上一次执行完成,它有什么好处?

c# - 如何从 C# 中使用具有另一个函数作为参数的 Rust 函数?

c# - System.NullReferenceException 创建 viewModel

C# Mongo 驱动程序 - MongoCollection.Group 方法

c# - 如何创建无法进行多个枚举的 IEnumerable<T> ?

c# - OpenFileDialog 无法加载 CSV 文件,但可以加载 xls/xlsx Excel 文件

c# - 动态多对象锁定——多线程

c# - 开源 .Net wiki?

c# - 如何将 ascii 字节向量转换为字符串?

c# - 无法获取 head 的内部内容,因为内容不是字面意思。 - 尝试附加到标题