gpt4 book ai didi

c# - 我应该在分配新对象之前处理旧对象吗?

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

假设我们有两个类 FooBar,如下所示。

public class Foo
{
public static Bar BarInstance { get; set; }

public static void Main()
{
AssignBar("A");
AssignBar("B");
}

private static void AssignBar(string name)
{
BarInstance = new Bar(name);
}
}

public class Bar : IDisposable
{
public Bar(string name)
{
Name = name;
}
public string Name { get; set; }
protected virtual void Dispose(bool disposing)
{
if (!disposing)
{
return;
}
}
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
}

当对象 A 被对象 B 替换时。我希望 Dispose 被调用,因为不再存在对对象 A 的引用,但它不会被调用。你能解释一下为什么吗?

如果我希望对象 A 被释放,我是否应该像下面那样执行 CurrentBar.Dispose

    private static void AssignBar(string name)
{
if (BarInstance != null)
{
BarInstance.Dispose();
}
BarInstance = new Bar(name);
}

最佳答案

这取决于所有权。

Bar 是否被赋予 Foo,暗示 Foo 现在拥有 Bar?

如果是这样,那么,您应该在分配新实例之前对旧实例调用Dispose

Bar 是给 Foo 的,暗示它更像是一笔贷款,即。您可以引用和使用此对象,但它属于其他对象?

如果是这样,那么,您不应该在分配新实例之前对旧实例调用Dispose


你的代码在这一点上并不完全清楚,我建议你清理它,这样将来更容易推理这种类型。

在我看来,您有 3 种可能情况中的一种:

  1. Foo 始终拥有 Bar。在这种情况下,我会将旧实例的处置放在属性的 setter 中,如果获取新 Bar 实例的唯一方法,则完全删除公共(public) setter 它是通过您声明的方法。
  2. Foo 从不拥有 Bar。在这种情况下,我不会添加任何处理旧实例的代码,但我质疑该方法的存在。在这种情况下,很可能没有人会真正拥有新建的实例。
  3. Foo 仅拥有通过您的方法创建的 Bar 实例,但不拥有通过公共(public) setter 提供给它的实例。在这种情况下,我会添加一个新字段来跟踪 Foo 是否拥有 Bar,并在方法中将其设置为 true,然后清除它在属性 setter 中。

Dispose 没有任何特殊之处,从 C# 的角度来看,它只是另一种方法,因此不会自动调用此方法。

但是,如果对象引用非托管资源,当对象在某个时间点符合收集条件时,将执行其终结器以释放那些非托管资源。但是,要在知道不再需要它们时确定性地释放它们,您需要调用 Dispose

关于c# - 我应该在分配新对象之前处理旧对象吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25198766/

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