我试过这样的事情:
using (DataRow newRow = summary.NewRow())
{
summary.Rows.Add(newRow);
}
但它不起作用。我得到错误:
'System.Data.DataRow':在 using 语句中使用的类型必须隐式转换为 'System.IDisposable'
有人可以向我解释为什么我不能像这样和/或类似的方式处理 DataRow 吗?谢谢。
对于要在using
块内使用的某些对象,它必须实现 IDisposable 接口。DataRow
没有实现 IDisposable ,这就是您收到错误的原因。不太确定为什么要首先处理 DataRow。
提供一种方便的语法,确保正确使用 IDisposable 对象。
编辑:(对于您想要重用新行的评论)
你不应该。DataTable 存储新行的引用,再次使用新创建的行会导致数据表中已经存在行的异常,因此对于添加行,您总是希望使用DataTable.NewRow
方法创建新行。
来自MSDN:
提供给 using 语句的对象必须实现 IDisposable 接口。该接口提供了 Dispose 方法,该方法应该释放对象的资源。
DataRow
不提供Dispose()
方法。
现在,当您添加 new 时DataRow
,您不需要处理它(也不能),因为Rows.Add
实际上是存储对新行的引用,而不是对象的副本。因此,只需创建您的行并将其传递给 的Add()
方法DataRowCollection
,您无需对新行进行任何处理。
根据您的评论:当您将引用传递给Add()
方法时,引用的副本将存储在表中。之后,您可以自由地使用相同的引用来创建新对象并再次存储引用。Dispose()
方法主要用于释放非托管资源:
使用此方法关闭或释放实现此接口的类的实例所持有的非托管资源,例如文件、流和句柄。按照惯例,此方法用于与释放对象持有的资源或准备对象以供重用相关的所有任务。
如果您的对象不包含任何非托管资源,则无需显式释放它(与 C 或 C++ 不同) - 当无法引用该对象时(当指向该对象的引用计数变为零时)垃圾收集器会处理它,它会在某个时候自动(不一定立即)删除它。
提供一种方便的语法,确保正确使用 IDisposable 对象。
通常,当您使用 IDisposable 对象时,您应该在 using 语句中声明和实例化它。
DataRow
类未实现IDisposable
接口,这就是您收到此错误的原因。
该using
语句与实现的类型相结合IDisposable
。你想实现哪个类,它必须实现IDisposable
接口和requireDispose
方法。
例如;
class Program
{
static void Main(string[] args)
{
using(YourClass y = new YourClass())
{
}
}
}
class YourClass : IDisposable
{
public void Dispose()
{
}
}
using 块需要能够在块范围结束时访问方法 IDisposable.Dispose。因此,您的对象必须声明它实现此接口以“使用”兼容。
DataRow
不是一次性的,所以你根本不需要这样做,编译器会提供帮助:它甚至不会让你,因为类型不遵循所需的模式(即它应该实现IDisposable
,根据错误消息) .
如果重点是你想newRow
再次使用,那么这里有一个误解。在这种情况下,某些东西是否是一次性的是无关紧要的,在这种情况下,两者都可以自由地“覆盖”:
DataRow newRow; // null;
newRow = summary.NewRow(); // get a row
newRow = anotherSummary.NewRow() // get a different row
在上述情况下,在第二次分配之后,newRow
忘记了所有关于它的第一次分配。
可处置性发挥作用的地方在于,您应该注意不要在它们是一次性的时就“忘记”它们(因为您有责任处置它们),但在这种情况下,您不必担心这一点。