gpt4 book ai didi

powershell - 哈希可以只读吗?

转载 作者:行者123 更新时间:2023-12-03 11:28:14 26 4
gpt4 key购买 nike

运行下面的代码,我假设 $CONST_HASH 不能被编辑。

Set-Variable -Name CONST_HASH -Value @{a=1} -Option Constant 

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

$CONST_HASH2 = @{}

但我可以追加或编辑它的值。

$CONST_HASH.A = 10
$CONST_HASH.B = 2

有什么办法可以避免这种情况吗?

最佳答案

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

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

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

$ReadOnlyDictionary = ([ordered]@{ a = 1 }).AsReadOnly()

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

$Dictionary = ([ordered]@{ Array = 1, 2, 3 }).AsReadOnly()

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

$Dictionary['Array'] = 4, 5, 6 # Error

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

$Dictionary['Array'][0] = 4
$Dictionary['Array'][1] = 5
$Dictionary['Array'][2] = 6

要使数组也成为只读的,您还需要将其包装起来:

$Dictionary = ([ordered]@{ Array = [Array]::AsReadOnly((1, 2, 3)) }).AsReadOnly()

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

关于powershell - 哈希可以只读吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50030335/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com