可以将哈希设置为只读吗?

Chr*_*uez 4 powershell

运行下面的代码,我认为$CONST_HASH无法编辑。

Set-Variable -Name CONST_HASH -Value @{a=1} -Option Constant 
Run Code Online (Sandbox Code Playgroud)

如果我尝试重置变量,它会失败

$CONST_HASH2 = @{}
Run Code Online (Sandbox Code Playgroud)

但我可以附加或编辑其值。

$CONST_HASH.A = 10
$CONST_HASH.B = 2
Run Code Online (Sandbox Code Playgroud)

有办法防止这种情况吗?

use*_*407 5

从技术上讲,这就是引用类型在 .NET 中的工作原理。当您将变量设置为只读时,这意味着您不能使变量引用不同的对象,但如果引用的对象不是不可变的,您仍然可以改变它。没有简单的方法可以使任意对象只读,除非对象本身支持该对象。

通常这涉及使用只读包装器包装对象。对于通用集合,您可以使用ReadOnlyCollection<T>ReadOnlyDictionary<TKey,TValue>类。

我不知道使其成为Hashtable只读的简单方法,但您可以使用OrderedDictionary它,它提供了使其只读的内置支持:

$ReadOnlyDictionary = ([ordered]@{ a = 1 }).AsReadOnly()
Run Code Online (Sandbox Code Playgroud)

注意:这不能传递,如果将可变对象放入只读集合中,它仍然是可变的。例如对于数组:

$Dictionary = ([ordered]@{ Array = 1, 2, 3 }).AsReadOnly()
Run Code Online (Sandbox Code Playgroud)

您不能将新数组分配给字典:

$Dictionary['Array'] = 4, 5, 6 # Error
Run Code Online (Sandbox Code Playgroud)

但您仍然可以修改存储在这里的数组:

$Dictionary['Array'][0] = 4
$Dictionary['Array'][1] = 5
$Dictionary['Array'][2] = 6
Run Code Online (Sandbox Code Playgroud)

要使数组也变为只读,您还需要将其包装:

$Dictionary = ([ordered]@{ Array = [Array]::AsReadOnly((1, 2, 3)) }).AsReadOnly()
Run Code Online (Sandbox Code Playgroud)

注意:由于 .NET 中的数组没有内置的只读支持,因此[Array]::AsReadOnly不会返回数组,而是返回ReadOnlyCollection<T>它的包装器。