处理嵌套的一次性物品?

apo*_*020 4 .net c# dispose idisposable

我想知道是否有关于处理嵌套在另一个一次性物品内的一次性物品的约定(在财产/公共领域,而不是私人成员).例如,DataSet包含DataTable,SqlCommand包含SqlConnection.

显而易见的是,一个班级处理它拥有的所有Disposable物品,剩下的就是其余部分.是否存在这样的惯例?如果是这样,.NET库如何确定谁拥有什么?如何确定是否正在处理嵌套对象?

PS:我一直想知道这个问题,显然有其他问题:调用SqlCommand.Dispose时会出现什么问题?

编辑1:发现配置DataSet,不配置其表.

// Fill dataset from sqldataadpater.
foreach (DataTable dt in dataSet.Tables)
{
    dt.Disposed += Program.DisposedEventHandler2;
}
Console.WriteLine("Disposing dataset");
dataSet.Dispose(); //Event not fired here.
Console.WriteLine("Disposing datatables maually");
foreach (DataTable dt in dataSet.Tables)
{
    dt.Dispose(); //Event fired here
}
#endregion
Run Code Online (Sandbox Code Playgroud)

Ste*_*ven 7

我通常遵循的经验法则是创造一次性物体的类也将处置它.作为一个例子:a SqlCommand不会释放它的连接,因为它没有创建它.该StreamReader在这个意义上的奇怪的行为,因为它总是处理基础流,即使是从外部供给的(我觉得这是很烦人的,请投这里当你喜欢微软解决这一问题).