65.9K
CodeProject 正在变化。 阅读更多。
Home

C# 的简单不可变 Hashtable

starIcon
emptyStarIcon
starIcon
emptyStarIconemptyStarIconemptyStarIcon

1.60/5 (2投票s)

2007年11月21日

2分钟阅读

viewsIcon

31001

downloadIcon

221

一个哈希表包装类,允许在程序的早期阶段用数据填充表,然后使其变为只读(不可变)以供后续使用。

引言

软件开发人员有时可能需要一个容器类,例如哈希表,该容器类可以在程序的早期阶段用数据填充,然后使其变为只读(不可变)以供后续使用。 仅靠属性或成员对象访问修饰符无法实现此目的。 即使某些类提供对其哈希表成员对象的只读访问权限,哈希表的内容仍然可以更改,即使哈希表本身无法更改。

不可变哈希表是一种混合哈希表集合,其中

- 内部成员哈希表永远不会直接提供给用户,以防止他们通过接口外部修改其内容。

- 只能通过 Add () 方法将项目添加到集合中,并且只能在调用 SetReadOnly () 方法之前添加。 一旦调用该方法,哈希表就是不可变的。

- 当程序在调试模式下运行时,不可变性通过异常抛出和 Debug.Assert 测试(因为这是一个设计问题)来强制执行。 因此,如果用户在 p_isReadOnlyFlag 为 true 后尝试调用诸如 Add () 之类的方法,则 ImmutableHash 对象在调试模式下运行时会引发断言错误,或者在发布模式下引发 InvalidOperationException。

背景

.NET 不允许用户将哈希表设为只读(或创建哈希表的只读副本,就像 ArrayList 容器一样)。

使用代码

ImmutableHash 类文件可以直接添加到项目或 dll 库项目中。 用户有责任将命名空间更改为适合其项目的内容。

using System;
using System.Threading;

namespace ImmutableHashTest
{
  class Program
  {
    static void Main (string[] args)
    {
      ImmutableHash iht = new ImmutableHash ();

      /// Objects can be added to the ImmutableHash
      /// iht until it is made read-only:

      iht.Add ("apples", 2);
      iht.Add ("oranges", 5);
      iht.Add ("peaches", 4);

      iht.SetReadOnly (); /// Make iht Immutable

      try
      {
        iht.Add ("plums", 6); /// will throw an exception
      }
      catch
      {
        Console.WriteLine ("could not add 'plums' to iht");

        Thread.Sleep (5000);
      }
    }
  }
}

关注点

为了使该类在现有应用程序中更易于使用,用户可以首先创建一个常规哈希表对象,并使用已创建对象的所有哈希表方法和属性; 然后在创建 ImmutableHash 时将此对象传递给 ImmutableHash。 一旦调用 SetReadOnly () 方法,就不能再通过 ImmutableHash 接口修改哈希表对象。

如果需要,可以在 ImmutableHash 接口中公开内部哈希表的其他本机方法。 但是,重要的是要理解,永远不应该返回内部哈希表对象本身,因为这会破坏此类的目的。

历史

初始版本。

© . All rights reserved.