这个哈希表不应该是只读的吗?

本文关键字:只读 哈希表 不应该 | 更新日期: 2023-09-27 18:10:15

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

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

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

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

最后修改_Parameters。这怎么可能呢?setter函数是否仅适用于我们用'='赋值的情况?

这个哈希表不应该是只读的吗?

No。你返回的是一个可以修改的引用。但是你不能重写引用本身。

考虑使用ReadOnlyDictionary<TKey, TValue>

考虑阅读不可变对象。

改变HashTable对象和改变HashTable的内容是有区别的。

没有setter确保没有人可以:

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

HashTable的内容是可以修改的

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

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

我正在获取对象的引用,这允许我操作它,但是没有setter,我不能将引用设置为新对象。

当您返回_Parameters时,您并没有返回一个全新的哈希表。您将返回对同一对象的另一个引用。这个,作为同一个对象的引用,有Hashtable可用的完整接口,包括修改它的东西。缺少setter的作用是阻止您用全新的Hashtable替换以前的_Parameters

对类对象(与结构体相反)具有只读属性只能防止修改属性的值,在这种情况下是对象引用。但是,当您访问该属性时,您将获得对内部HashTable对象的引用,并且您可以自由地调用返回的HashTable对象上的任何公共方法,包括在HashTable中添加和删除条目。只读属性的作用是防止调用者用完全不同的HashTable对象替换您的HashTable对象。