3

这是否Dictionary可以清理所有关键参考?

public static function cleanDic(_dic:Dictionary):void
{
    for (var eachKey:String in _dic)
    {
        delete _dic[eachKey];
    }
}

我担心,如果我在for循环期间删除某些键会导致无法清除所有元素。

这会发生吗?

谢谢

4

3 回答 3

10

首先,我不喜欢这里给出的任何答案。现在,解释一下:

  1. 您的代码不会删除所有字典键,因为字典键可能是任何对象,而不是必需的字符串。所以,你需要迭代:

    for (key:Object in dictionary) delete dictionary[key];

  2. 当您不想创建一个新字典时,有许多合理的场景——创建一个新字典有时是一个非常糟糕的替代品。例如,您在代码中的两个位置共享值(等等,为什么还要创建一个?)。一旦你创建了一个新的,代码中的位置应该被通知并以某种方式重新获得对新对象的新引用。因此,有时从字典中删除所有键虽然在计算上并不完全有效,但与创建一个新键相比会更好,因为它会使事情变得简单。

  3. 有一个有趣的方面Dictionary。它实际上实现为两个哈希表,一个包含字符串键,另一个 - 指针键(对象键)。不幸的是,这是由于糟糕/粗心的设计,而不是故意的。它具有继承自的字符串哈希表Object和自己的指针键之一。通常希望将字符串放入字典(或任何其他隐式强制转换为字符串的内容,如数字或逻辑值),因此,当您发现自己使用带字典的字符串键时 - 再想一想,您可能想Object改用.

  4. 在字典循环期间会发生什么:在幕后创建了一个键集合,实际上,您迭代了该集合。然而,由于字典的双重性质,两个键可能被认为是相同的(例如,如果您添加了一个字符串"1"和 int1键 - 您将只得到其中一个。删除键时,在不同的播放器版本有不同的结果。在一些旧版本中,有一个错误,在删除这些键然后序列化字典后,其中一个键保留在其中。但是,再次,您应该避免使用字符串或数字作为键。

于 2012-09-27T09:11:13.903 回答
2

无需编写清理Dictionary. 只需使用:

yourdictionary = new Dictionary();

和 GarbageCollector 会做的伎俩。

于 2012-09-27T08:00:31.810 回答
2

我不太清楚你的意思

我担心,如果我在 for 循环中删除某些键会导致无法清除所有元素。

但是您的代码示例是正确的,这就是Dictionary可以清理 a 的方式。(假设您只使用Dictionary带有string键的对象,因为您的for循环使用string. 请参阅下面的工程师评论。)

或者,您可以将您的字典设置为一个新实例 - 实现同样的速度稍快:

var dict:Dictionary = new Dictionary ();

... // use dict here      

dict = new Dictionary (); // effectively cleans the dictionary

Flash 垃圾收集器应该释放字典中所有被丢弃的元素。__

于 2012-09-27T08:00:33.727 回答