函数中的 Dispose 方法重要吗?
does the Dispose method inside a function matters?
所以最近我一直在使用一次性对象,我想知道在函数中处理对象是否有益?
在这两个函数之间,使用 .Dispose() 在函数内部真的很重要,因为函数中的所有对象一旦完成
就会消失
void FOO()
{
var x= new DisposableObject();
//stuff
}
void FOO()
{
using(var x= new DisposableObject())
{
//stuff
}
}
你应该总是Dispose()
一个需要它的对象。即使对象被垃圾回收,也可能存在未释放的非托管资源。调用 Dispose()
(或第二个示例中的 using
)确保对象可以正确释放它需要的非托管资源。
物体不会简单地消失。
GC 收集不再引用的实例。这可能需要一些时间,因为 GC 会决定何时 运行 并且在它完成之前不会处理该实例。
如果此一次性资源具有非托管资源并正确实施,则资源将由单线程终结器处理。
如果您可以接受一段时间内未处理实例并且终结器不忙......那么请继续。不过还是尽快处理掉比较好。
All objects within a function will vanish as soon as it finishes
对象将保留,本地引用将消失。当垃圾收集器 运行 时,对象将 'vanish' 并确定它们无法访问。
在从内存中删除无法访问的对象之前,它的终结器将运行(如果已实现)清除所有非托管资源。
问题是所有这些都不是确定性的。你永远不知道 GC 什么时候会 运行,在某些情况下甚至不会执行终结器。
如果可能,您应该始终调用 Dispose
方法。
在 Dispose() 方法中设置断点并 运行 这些测试与调试。
TestMethod1 未命中断点,而 TestMethod2 命中断点。
正如其他人所指出的,这是因为 GC 在 .Net 中的工作方式
如果您要实现 IDiisposeable 接口,您可能希望将 class 放在 using 语句中或调用 .Dispose() 以便获得更可预测的应用程序行为。
using System;
using Microsoft.VisualStudio.TestTools.UnitTesting;
namespace UnitTestProject2
{
[TestClass]
public class UnitTest1
{
[TestMethod]
public void TestMethod1()
{
var disposable = new DisposableObject();
disposable.DoSomething();
}
[TestMethod]
public void TestMethod2()
{
using (var disposable = new DisposableObject())
{
disposable.DoSomething();
}
}
}
public class DisposableObject : IDisposable
{
public void Dispose()
{
// dispose here
}
public void DoSomething()
{
// do something here
}
}
}
所以最近我一直在使用一次性对象,我想知道在函数中处理对象是否有益? 在这两个函数之间,使用 .Dispose() 在函数内部真的很重要,因为函数中的所有对象一旦完成
就会消失void FOO()
{
var x= new DisposableObject();
//stuff
}
void FOO()
{
using(var x= new DisposableObject())
{
//stuff
}
}
你应该总是Dispose()
一个需要它的对象。即使对象被垃圾回收,也可能存在未释放的非托管资源。调用 Dispose()
(或第二个示例中的 using
)确保对象可以正确释放它需要的非托管资源。
物体不会简单地消失。
GC 收集不再引用的实例。这可能需要一些时间,因为 GC 会决定何时 运行 并且在它完成之前不会处理该实例。
如果此一次性资源具有非托管资源并正确实施,则资源将由单线程终结器处理。
如果您可以接受一段时间内未处理实例并且终结器不忙......那么请继续。不过还是尽快处理掉比较好。
All objects within a function will vanish as soon as it finishes
对象将保留,本地引用将消失。当垃圾收集器 运行 时,对象将 'vanish' 并确定它们无法访问。
在从内存中删除无法访问的对象之前,它的终结器将运行(如果已实现)清除所有非托管资源。
问题是所有这些都不是确定性的。你永远不知道 GC 什么时候会 运行,在某些情况下甚至不会执行终结器。
如果可能,您应该始终调用 Dispose
方法。
在 Dispose() 方法中设置断点并 运行 这些测试与调试。 TestMethod1 未命中断点,而 TestMethod2 命中断点。
正如其他人所指出的,这是因为 GC 在 .Net 中的工作方式 如果您要实现 IDiisposeable 接口,您可能希望将 class 放在 using 语句中或调用 .Dispose() 以便获得更可预测的应用程序行为。
using System;
using Microsoft.VisualStudio.TestTools.UnitTesting;
namespace UnitTestProject2
{
[TestClass]
public class UnitTest1
{
[TestMethod]
public void TestMethod1()
{
var disposable = new DisposableObject();
disposable.DoSomething();
}
[TestMethod]
public void TestMethod2()
{
using (var disposable = new DisposableObject())
{
disposable.DoSomething();
}
}
}
public class DisposableObject : IDisposable
{
public void Dispose()
{
// dispose here
}
public void DoSomething()
{
// do something here
}
}
}