gpt4 book ai didi

c# - 在哪里调用在构造函数中创建的 IDisposable 的 Dispose()?

转载 作者:可可西里 更新时间:2023-11-01 08:03:46 25 4
gpt4 key购买 nike

在何处为对象拥有的 IDisposable 对象调用 Dispose()

public class MyClass
{
public MyClass()
{
log = new EventLog { Source = "MyLogSource", Log = "MyLog" };
FileStream stream = File.Open("MyFile.txt", FileMode.OpenOrCreate);
}


private readonly EventLog log;
private readonly FileStream stream;

// Other members, using the fields above
}

我应该实现 Finalize() 吗?对于这个例子?如果我根本不实现任何东西怎么办?会不会有问题?

我的第一个想法是 MyClass 应该实现 IDisposable。但是an MSDN article中的下面语句把我弄糊涂了:

Implement IDisposable only if you are using unmanaged resources directly. If your app simply uses an object that implements IDisposable, don't provide an IDisposable implementation.

这个说法错了吗?

最佳答案

如果 MyClass 拥有 IDisposable 资源,那么 MyClass 本身应该是 IDisposable,当 MyClass 调用 Dispose() 时,它应该释放封装的资源:

public class MyClass : IDisposable {
// ...
public virtual void Dispose() {
if(stream != null) {
stream.Dispose();
stream = null;
}
if(log != null) {
log.Dispose();
log = null;
}
}
}

不,你不应该在这里实现终结器。

注意:另一种实现可能是这样的:

private static void Dispose<T>(ref T obj) where T : class, IDisposable {
if(obj != null) {
try { obj.Dispose(); } catch {}
obj = null;
}
}

public virtual void Dispose() {
Dispose(ref stream);
Dispose(ref log);
}

关于c# - 在哪里调用在构造函数中创建的 IDisposable 的 Dispose()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26097829/

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