在DataTable中使用语句

时间:2012-07-26 06:01:26

标签: c# asp.net c#-4.0 using

在我的下面的函数中...我想返回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 个答案:

答案 0 :(得分:2)

你为什么会这样?

using (obj)
{
    // Do something
}

基本上与:

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

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

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

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

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

编辑:从另一方面来看,这篇文章指出,在DataTable中,即使它实现了IDisposable,也没有任何东西可以处置:Should I Dispose() DataSet and DataTable?

答案 3 :(得分: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 ;
}