我想知道是否有关于处置一次性物品(处于财产/公共领域而不是私人成员)的一次性物品的处置方面的任何公约。例如,一个DataSet包含DataTable,一个SqlCommand包含一个SqlConnection。处理嵌套一次性物品?
显而易见的情况是,一个班级会处理它拥有的所有一次性物品,剩下的部分将会丢弃。是否存在这样的约定?如果是这样,.NET库如何确定谁拥有什么?我怎样才能找出嵌套对象是否被丢弃?
PS:我一直想知道这一段时间,显然这样有别人:What gets disposed when SqlCommand.Dispose is called?
编辑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
有时候它很烦人,这意味着你可以使用'新的StreamReader(新的FileStream(...))'而不必担心有两个'使用'语句......通常可以提高可读性,国际海事组织。 – 2010-07-22 06:36:24
@Jon:我明白为什么BCL团队选择这个API设计。它指导.NET开发人员“成功的基石”(就像Rico Mariani所说的那样)。但是,我错过了重载的枚举或布尔标志,命令'StreamReader'使流保持活着。在当前的设计中,使流保持活动状态意味着您将不得不使用'class DoNotDisposeStreamDecorator:Stream'封装流。 – Steven 2010-07-22 06:46:34
是的,我自己就有这样一个装饰器... – 2010-07-22 07:21:49