C# 的简单不可变 Hashtable






1.60/5 (2投票s)
2007年11月21日
2分钟阅读

31001

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 接口中公开内部哈希表的其他本机方法。 但是,重要的是要理解,永远不应该返回内部哈希表对象本身,因为这会破坏此类的目的。历史
初始版本。