gpt4 book ai didi

c# - 如果对象是 IDisposable 类的字段,我们是否应该将它们标记为只读

转载 作者:太空狗 更新时间:2023-10-30 01:20:11 24 4
gpt4 key购买 nike

问题描述:

  1. 我有一个实现 IDisposable 的类 (FooClass),它采用另一个一次性 (OtherDisposableClass) 作为其构造函数的参数。
  2. 我创建了一个 OtherDisposableClass 实例
  3. 我创建了一个 FooClass 实例并将实例 OtherDisposableClass 传递给它
  4. OtherDisposableClass 的实例不应该是可变的,所以我将其标记为只读
  5. 我无法在 Dispose 方法中删除对 OtherDisposableClass 实例的引用

问题

在这里最好的事情是什么?我们应该

  1. 不将 OtherDisposableClass 的实例标记为只读,以便我们可以在 Dispose 方法中将其设置为“null”
  2. 将 OtherDisposableClass 标记为只读并且不再删除对它的引用。
  3. 其他

请详细说明您的答案。谢谢

public class FooClass : IDisposable
{
private readonly OtherDisposableClass _disposable;
private readonly string _imageSource;
private readonly string _action;
private readonly string _destination;

private bool _isInitialized;

public FooClass(OtherDisposableClass disposable)
{
_disposable = disposable;
}
~FooClass()
{
// Finalizer calls Dispose(false)
Dispose(false);
}

public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}

protected virtual void Dispose(bool disposing)
{
// Not possible because _disposable is marked readonly
_disposable = null;
}
}

最佳答案

创建 OtherDisposableClass 的事情应该是处理它...让它单独留在 FooClass 中(你可以让它 readonly 如果你愿意的话)。

将它设置为 null 无论如何都没有效果,它只会将 FooClass 中的引用设置为 null(无论如何都将被释放)。

编辑

从给定的代码看来,您甚至不需要在此处实现 IDisposable - 这只是让事情变得过于复杂。如果您在 FooClass 的构造函数中创建了一个 OtherDisposableClass 的实例,那么您可以实现 IDisposable 并简单地在 中调用 OtherDisposableClass.Dispose() >FooClass.Dispose().

这里 FooClass 是在依赖于 OtherFooClass 的情况下创建的 - OtherFooClass 将比 FooClass 长寿 - 因此 FooClass 应该首先被 GC'd 然后将没有对 OtherDisposableClass 的引用剩余 - 这将允许它被 GC'd

关于c# - 如果对象是 IDisposable 类的字段,我们是否应该将它们标记为只读,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20051486/

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