整个应用程序的一个对象或每次调用一个对象+处理

问题描述:

我有一个IDisposable类A.我需要在B类的另一个方法M中使用A的对象。方法M被调用多次(每天百万次)。我应该使用M内部的A的本地对象并配置一次,还是应该在B内部声明类级别的静态成员,并在应用程序结束后进行配置。 如果我不清楚,请告诉我。整个应用程序的一个对象或每次调用一个对象+处理

+0

为什么B不能在构造函数中使用A实例并根据需要将其提供给M,然后B在完成后就可以将其摧毁?一个对象负责清除它通过公共接口提供的资源,除非该接口是工厂方法或构造函数,在这种情况下调用者负责。 – hoodaticus

+0

对M的每个调用都是通过B的新实例进行的。 –

+1

假设它是线程安全的,像单例那样的声音在这里是合适的。 – hoodaticus

该应用程序的一个对象是Singleton;虽然它们在特定情况下很有用,但它们通常不是一个好主意。详细解释原因见this question

实现IDisposable的类最好在using声明的范围内使用,该声明将负责为您处理它。

明确的例外情况是,在单个业务操作的上下文中需要多次调用一次性类时 - 并且该操作分散得太多以致无法包装在using声明中。在这种情况下,将所有呼叫包装到第一个作为私人成员的第二个一次性类中。当第二类处置时,它应该处置任何一次性的私人成员。

+0

调用类B的方法M来源于B的多个实例。 像下面一样 B b = new B() b.M() 我不会看到使B一次性使用的一点。 –

+0

另一个非显而易见的情况是,实现'IDisposable'的类应该在应用程序的整个生命周期内被保留,而不是在'using'中被使用的情况是'HttpClient'。更多信息可以在这里找到(https://aspnetmonsters.com/2016/08/2016-08-27-httpclientwrong/)。 –

+0

@BradleyUffner这是我脑海中最突出的例子,使我无法从绝对的角度讲话。 –