这个散列表不应该只读吗?

时间:2011-09-29 17:13:57

标签: c# hashtable getter-setter

我有一个类,它有一个名为_Parameters的哈希表的getter函数。

private Hashtable _Parameters = new Hashtable();
public Hashtable Parameters { get { return _Parameters; } }

_Parameters未在代码中的任何其他位置引用。现在,由于没有setter函数,我认为这个类之外的任何东西都不能修改_Parameters存储的内容,只能读取它。然而事实并非如此。另一个类调用此代码(其中template是上面提到的类的实例)

template.Parameters[key] = parameters[key];

这最终会修改_Parameters。这怎么可能?如果我们使用'='?

分配vales,setter函数是否仅适用

5 个答案:

答案 0 :(得分:5)

没有。您将返回一个可以修改的引用。但是你不能覆盖引用本身。

请考虑使用ReadOnlyDictionary<TKey, TValue>

考虑阅读Immutable Objects。它应该向你解释这个主题。

答案 1 :(得分:3)

更改HashTable对象或更改HashTable的内容之间存在差异。

缺乏制定者确保没有人能够:

  • 将HashTable设置为NULL
  • 将HashTable的引用更改为另一个HashTable。

但是可以更改HashTable的内容。

答案 2 :(得分:2)

您可以访问Hashtable的方法,您只是无法将其设置为新值(例如NULL或新的Hashtable实例)。

例如,如果我有一个字符串列表和一个带有getter但没有setter的Property,我可以添加到列表中,从列表中删除,调用Clear()方法清空列表...但是我不能做myList = null(或myList = new List()),因为没有setter。

我正在获取对象的引用,这允许我操作它,但是如果没有setter,我就无法设置对新对象的引用。

答案 3 :(得分:1)

当您返回_Parameters时,您不会返回全新的Hashtable。您将返回对同一个的另一个引用。这一个是对同一个对象的引用,它具有Hashtable的完整接口,包括修改它的东西。设置器缺少的功能是阻止您使用全新的_Parameters

替换之前的Hashtable

答案 4 :(得分:1)

对类对象(而不是结构体)具有只读属性只会阻止修改属性的值,在本例中为对象引用。但是,当您访问该属性时,您将获得对内部HashTable对象的引用,并且可以在返回的HashTable对象上调用任何公共方法,包括在HashTable中添加和删除条目。只读属性的作用是阻止调用者用一个完整的不同HashTable对象替换你的HashTable对象。