1

在我下面的函数中...我想返回 DataTable ..

我应该转换以下行

DataTable table = CreateTable<T>();

跟随

using(DataTable table = CreateTable<T>())
{
}

功能

public static DataTable ConvertTo<T>(IList<T> list)
{
    DataTable table = CreateTable<T>();

    int iColCount = table.Columns.Count;
    for (int j = 0; j < iColCount; j++)
    {
        DataColumn myDC = table.Columns[j];
        myDC.DataType = System.Type.GetType("System.String");
    }

    Type entityType = typeof(T);
    PropertyDescriptorCollection properties = TypeDescriptor.GetProperties(entityType);
    foreach (T item in list)
    {
        DataRow row = table.NewRow();
        foreach (PropertyDescriptor prop in properties)
        {
            row[prop.Name] = prop.GetValue(item);
        } table.Rows.Add(row);
    }
    return table;
}
4

4 回答 4

2

你为什么要?

using (obj)
{
    // Do something
}

基本上是一样的:

try
{
    // Do something
}
finally
{
    obj.Dispose();
}

关键是一旦您不再需要它,就释放对象使用的资源。在您的情况下,您将数据表返回给调用函数,因此您仍然需要它。因此,没有理由将您的函数包装在using语句中。

于 2012-07-26T06:05:22.387 回答
0

using语句可确保调用Dispose,即使在调用对象上的方法时发生异常也是如此。如果您想使用请询问此问题“对象是一次性的吗?”。如果是,那么使用是最好的选择。您可能想尝试阅读更多关于此的内容。

http://msdn.microsoft.com/en-us/library/yh598w02.aspx

于 2012-07-26T06:04:46.063 回答
0

您不需要使用 using inside ConvertTo<T>(IList<T> list),但调用者ConvertTo<T>(IList<T> list)负责处理该 DataTable。

using (var table = Test.ConvertTo(testList)) 
{
   // do stuff with DataTable
}

编辑:从另一面来看,有这篇文章,其中指出在 DataTable 中即使实现 IDisposable 也没有什么可处置的:我应该 Dispose() DataSet 和 DataTable 吗?

于 2012-07-26T06:11:21.050 回答
0

注意:

using 语句调用对象的Dispose方法,并在调用 Dispose 后立即使对象本身超出范围。

Dispose释放DataTable.

这样您就不能同时使用using Statement和返回DataTable对象。

public static DataTable ConvertTo<T>(IList<T> list)
{
    DataTable resultTable = CreateTable<T>();

    using(DataTable table = CreateTable<T>())
    {
         ....
         resultTable = table;
    }

    // 'table' object disposed already
    return resultTable ;
}
于 2012-07-26T06:15:34.617 回答