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 inside を使用する必要はありませんがConvertTo<T>(IList<T> list)、呼び出し元はConvertTo<T>(IList<T> list)その DataTable を破棄する責任があります。

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

編集: 反対側から、IDisposable を実装していても、DataTable には破棄するものがないことを示すこの投稿があります: I Dispose() DataSet and DataTable?

于 2012-07-26T06:11:21.050 に答える
0

usingステートメントを使用すると、オブジェクトのメソッドを呼び出しているときに例外が発生した場合でも、Disposeが確実に呼び出されます。使用したい場合は、「オブジェクトは使い捨てですか?」と質問してください。その場合は、使用するのが最適なオプションです。これについてもっと読みたいと思うかもしれません。

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

于 2012-07-26T06:04:46.063 に答える
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 に答える