@ {}和[Hashtable] :: Clear()有什么区别?

时间:2013-08-06 19:43:06

标签: .net powershell

所有!

我正在编写将标准INI文件结构转换为基于哈希表和数组的代码的代码。例如,下面显示的INI片段:

[Book]
title="Moby Dick"
author="Herman Melville"
genre=fiction
genre=fantasy

[Book]
title="James and the Giant Peach"
author="Roald Dahl"
genre="fiction"

看起来像:

@{
    "Book" = [
        @{
            "title" = ["Moby Dick"];
            "author" = ["Herman Melville"];
            "genre" = ["fiction","fantasy"]
        },
        @{
            "title" = ["James and the Giant Peach"];
            "author" = ["Roald Dahl"];
            "genre" = ["fiction"]
        }
    ]

}

我想说明具有多个具有相同名称的部分的INI文件和具有多个同名命名属性的部分,因此这个数据结构。我知道我可以使用树来做同样的事情,但我并不关心它的速度,这在我编写它时更容易实现。

这是通过更新哈希表来完成的,哈希表将一个部分中的所有属性与它们的值相关联(让我们称之为$items),然后更新将每个部分与前面提到的哈希表相关联的主哈希表(让我们称之为一个{ {1}})。哈希表是全局的,并且在迭代到新的部分时清除属性哈希表。

虽然我编写了这样做并运行良好的代码,但我对Powershell清除哈希表的方式感到困惑了几分钟。如果我使用$results清除$items$items.Clear()中所有元素相关联的哈希表也会被清除。但是,如果我“清除”,则不会发生这种情况。它通过陈述$results

我假设发生这种情况是因为前一种情况下的哈希表都是对全局哈希表的引用,并且是后者中的独立对象。这是发生了什么事吗?

代码如下;抱歉,如果其中任何一个令人困惑(并且它不是典型的Powershell语法)。将$items=@{}替换为$items = @{}以复制:

$items = $items.Clear()

2 个答案:

答案 0 :(得分:4)

$items这样的变量指的是一个存储位置,在这种情况下包含一个哈希表。为变量赋值@{}时,您将为变量分配对新的空哈希表的引用。如果没有其他内容引用原始哈希表,垃圾收集器将回收其内存。在哈希表上执行Clear()方法会导致它重置为空状态。

答案 1 :(得分:0)

首先,我认为你的意思是:$ items.Clear()而不是$ items = $ items.Clear()

我必须仔细看看,因为我还没有看到任何可疑的东西,但我只是想让你知道,为了回答一个更基本的问题,上面的所有代码都是在做你能做的事情。当应用于内存中的哈希表和您正在存储的文件时,使用ConvertTo-Json和ConvertFrom-Json cmdlet获取Powershell中的几行。试一试,你会明白我的意思。