gpt4 book ai didi

c# - 构造函数注入(inject)对象的处置

转载 作者:行者123 更新时间:2023-11-30 13:51:24 30 4
gpt4 key购买 nike

假设我有一个类将自身与另一个类相关联。它看起来像下面这样:

public class DisposableClassOne : IDisposable
{
private class mDisposableClassTwo;

public DisplosableClassOne(DisposableClassTwo dcTwoInjected)
{
mDisposableClassTwo = dcTwoInjected;
}

public void Dispose()
{
// Should I dispose here? or make caller dispose of dcTwoInjected
//mDisposableClassTwo.Dispose();
}
}

我应该调用mDisposableClassTwoDispose方法还是让调用者这样处理?

using(DisposableClassTwo dcTwoInjected = new DisposableClassTwo())
using(DisposableClassOne dcOne = new DisposableClassOne(dcTwoInjected))
{
// do stuff with dcOne
}

我认为让调用者处理它是最好的方法,但我认为通过将调用放在 Dispose 方法中可以保证它会被调用。有更好的方法来处理这个问题吗?

最佳答案

如果您正在创建的类<​​em>逻辑上拥有(1) 构造函数注入(inject)的资源,那么它应该在内部处理它。如果它不拥有该资源,则它什么也不做,并依靠消费者来决定何时处置它。

如果您的类拥有对非托管资源的引用,您可能还需要实现终结器(析构函数),因为根本无法保证任何人都会调用您的Dispose 方法。

通常,您希望避免调用者必须决定何时处理传递给类的构造函数的对象的情况。调用者有可能过早地处理资源(或持有它超过必要的时间)。在某些设计中,这并不总是一件容易实现的事情……遗憾的是,一次性对象模式并不总是与自身干净利落地组合在一起。


(1) 所有权 是指您的类控制着它所传递的资源的生命周期,没有其他代码持有对它的引用。如果任何其他代码(其生命周期与您的类的生命周期无关)持有对该资源的引用并将独立使用它,那么您不是该资源的所有者

关于c# - 构造函数注入(inject)对象的处置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4557860/

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