运行下面的代码,我认为$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)
有办法防止这种情况吗?
从技术上讲,这就是引用类型在 .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>它的包装器。
| 归档时间: |
|
| 查看次数: |
1037 次 |
| 最近记录: |