Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 这个哈希表不应该是只读的吗?_C#_Hashtable_Getter Setter - Fatal编程技术网

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

C# 这个哈希表不应该是只读的吗?,c#,hashtable,getter-setter,C#,Hashtable,Getter Setter,我有一个类,它有一个名为_Parameters的哈希表的getter函数 private Hashtable _Parameters = new Hashtable(); public Hashtable Parameters { get { return _Parameters; } } _参数不在代码中的任何其他位置引用。现在,由于没有setter函数,我认为这个类之外的任何东西都不能修改_参数存储的内容,只能读取它。但事实并非如此。另一个类调用此代码,其中模板是上述类的实例 templa

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

private Hashtable _Parameters = new Hashtable();
public Hashtable Parameters { get { return _Parameters; } }
_参数不在代码中的任何其他位置引用。现在,由于没有setter函数,我认为这个类之外的任何东西都不能修改_参数存储的内容,只能读取它。但事实并非如此。另一个类调用此代码,其中模板是上述类的实例

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

这最终会修改_参数。这怎么可能?setter函数是否仅适用于使用“=”赋值的值?

您可以访问哈希表的方法,但不能将其设置为新值,例如NULL或新的哈希表实例

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


我正在获取对对象的引用,这允许我对其进行操作,但如果没有setter,我无法将引用设置为新对象。

否。您正在返回一个引用,该引用可以修改。但您不能覆盖引用本身

考虑改用一种新的方法


也可以考虑仔细阅读。它应该向您解释主题。

当您返回参数时,您并没有返回一个全新的哈希表。您正在返回对同一个的另一个引用。这一个是对同一对象的引用,其上有可用的Hashtable的完整接口,包括修改它的内容。缺少setter会阻止您使用全新的哈希表替换以前的_参数

更改哈希表对象或更改哈希表的内容是有区别的

缺少二传手确保没有人能够:

将哈希表设置为NULL 将哈希表的引用更改为另一个哈希表。
但是,哈希表的内容可以更改。

将只读属性设置为类对象,而不是结构,只会防止修改属性的值,在本例中是对象引用。但是,当您访问该属性时,您将获得对内部哈希表对象的引用,并且您可以自由地对返回的哈希表对象调用任何公共方法,包括在哈希表中添加和删除条目。只读属性的作用是防止调用者用完全不同的哈希表对象替换哈希表对象

这很有道理,谢谢你。我可以将哈希表更改为只读字典,但它不是我的代码。我只是想更好地理解它:@Claus:只是澄清一下,你说你要返回一个引用,可以修改。但是您不能覆盖引用本身。。更准确地说,您正在返回对对象实例的引用,并且您不能从外部更改内部变量引用的对象,因为外部会看到引用变量的副本。