我有一个类,它有一个名为_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函数是否仅适用答案 0 :(得分:5)
没有。您将返回一个可以修改的引用。但是你不能覆盖引用本身。
请考虑使用ReadOnlyDictionary<TKey, TValue>
。
考虑阅读Immutable Objects。它应该向你解释这个主题。
答案 1 :(得分:3)
更改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对象。