这个哈希表不应该是只读的吗?
本文关键字:只读 哈希表 不应该 | 更新日期: 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对象。