C#3.5,Windows 7 +
以下面的代码为例:
using (RegistryKey regKey = Registry.Users.OpenSubKey(regKeyString, true))
{
if (polRegKey.GetValue("Foo") == null)
polRegKey.CreateSubKey("Foo");
}
现在让我说我每秒都在循环中执行这段代码。
当我随后使用Process Explorer查看正在运行的进程时,我看到的是生成该注册表项的新句柄,但未及时销毁。相反,我看到的是每秒创建一个新的句柄,然后在大约20秒后,几乎所有句柄的大块同时被破坏。这是我期望从垃圾收集器那种行为。我认为C#的using
语句自动处理对象是错误的吗?它似乎以一种非常懒惰的方式进行,如果它实际上是在做它。
答案 0 :(得分:5)
您没有处置polRegKey.CreateSubKey("Foo");
的值。
using (RegistryKey regKey = Registry.Users.OpenSubKey(regKeyString, true))
{
if (polRegKey.GetValue("Foo") == null) {
using (polRegKey.CreateSubKey("Foo")) {
Console.Writeline("Key Created! You could also call Dispose()!");
}
}
}
答案 1 :(得分:3)
CreateSubKey() 也会返回 RegistryKey 。
你也需要处理那个返回的对象。