|
|
1
25
没有单一的答案,这取决于您的场景,关键点是由属性表示的可支配资源的所有权,如图所示 Jon Skeet points out .
另一个有趣的例子是System.DirectoryServices.DirectorySearcher,它有一个读/写一次性属性SearchRoot。如果此属性是从外部设置的,则假定基础资源不属于容器,因此不由容器处理。如果不是从外部设置的,则会在内部生成一个引用,并设置一个标志以确保将对其进行处理。你可以通过Lutz反射器看到这一点。 您需要确定容器是否拥有资源,并确保准确记录其行为。
使现代化 |
|
|
2
15
这实际上取决于谁名义上“拥有”一次性物品。在某些情况下,您可能希望能够传入对象,例如在构造函数中,而不需要您的类负责清理它。其他时候你可能想自己清理一下。如果您正在创建对象(如在示例代码中),那么几乎可以肯定,清理对象是您的责任。 至于财产——我不认为拥有财产真的应该转让所有权或诸如此类的东西。如果您的类型负责处理该对象,则应保留该责任。 |
|
|
3
5
真正的问题可能是面向对象的设计。如果容器已被处置,则其所有成员对象也应被处置。如果不是这样的话,听起来你可以处理一个身体,但你想让腿实例活下来。听起来不对。 |
|
|
4
4
|
|
|
5
3
首先要避免它
保持实例的私密性
即使它跟踪这一点,并且确定它正在处理它创建的实例,那么它仍然不能 处置它,因为其他类别现在可能有从公共财产获得的对它的引用。
如果无法避免的话。。。如果出于某种原因,代码无法以这些方式重构(正如我在问题中所规定的),那么我认为您将面临一些相当困难的设计选择。
这在某些情况下是有意义的,特别是在
(使用方法而不是属性可能更合适,因为方法名称可以用来进一步提示所有权)。
仅当仍为原始实例时才进行处置
此方法最能反映此处的实际情况,但可能难以正确实施。客户端代码仍然可以通过执行以下操作导致问题:
这里交换了一个新实例,调用了一个方法,然后恢复了原始实例。不幸的是
然而,就客户机代码如何与客户机交互而言,它也可能是最健壮的方法
一些评论者建议,如果有任何其他类仍然引用
|
|
|
6
2
你不能安全地打电话的原因
问题类似于允许访问用于锁定的实例。如果这样做,就很难确定从何处获取锁。
如果您可以避免暴露您的一次性实例,那么谁将处理对您的调用这一问题
|
|
|
7
1
我遇到的一件有趣的事情是,SqlCommand通常拥有一个SqlConnection(两者都实现IDisposable)实例。但是,在SqlCommand上调用dispose将 不 在Stackoverflow的帮助下,我也发现了这一点 right here . 因此,换句话说,“子”(嵌套?)实例是否可以/将在以后重用很重要。 |
|
8
0
如果出于某种原因,您认为某个可处置对象应该比容器寿命更长,我只能想到以下方法:
总而言之,我不确定这个设计是否合理。毕竟,您似乎期望客户端代码如下:
对我来说,这似乎是坏掉的客户端代码。这违反了得墨忒尔的法律,对我来说是常识。 |
|
|
9
0
|
|
|
10
-1
您只需在Dispose()中标记处置。毕竟处置不是析构函数-对象仍然存在。
也将此添加到其他类中。 |