返回后,IDisposable对象会发生什么?

Geo*_*Ego 4 .net c# idisposable return dataset

我有一个C#函数来翻转DataSet的方向:

static DataSet FlipDataSet(DataSet my_DataSet)
    {
        using (DataSet ds = new DataSet())
        {
            foreach (DataTable dt in my_DataSet.Tables)
            {
                DataTable table = new DataTable();
                for (int i = 0; i <= dt.Rows.Count; i++)
                {
                    table.Columns.Add(Convert.ToString(i));
                }
                DataRow r = null;
                for (int k = 0; k < dt.Columns.Count; k++)
                {
                    r = table.NewRow();
                    r[0] = dt.Columns[k].ToString();
                    for (int j = 1; j <= dt.Rows.Count; j++)
                        r[j] = dt.Rows[j - 1][k];
                    table.Rows.Add(r);
                }
                ds.Tables.Add(table);
                table.Dispose();
            }
            return ds;
        }
    }
Run Code Online (Sandbox Code Playgroud)

我从在interwebs上找到的片段修改了这段代码,将创建的DataSet包装在using语句中,并显式处理它创建的IDisposable对象.我的问题是,在处理时,DataSet(上面代码中的"ds")在返回时会发生什么?我退回后无法在ds上显式调用.Dispose(),显然,.NET返回值然后正确处理它,或者我完全错过了什么?

JSB*_*ոգչ 12

你可能不想这样做.在DataSet当配置using块退出不管如何块退出(正常退出,返回或抛出的异常),这意味着你返回值将被设置,并且大部分是不可用的给调用者.

正确的做法是using在此功能中没有阻止.该using块应该在调用者中.


Luk*_*keH 5

ds DataSet会只要你离开配置using块,所以你会返回一个配置DataSet给调用者.

为什么这么说,你不能叫DisposeDataSet你回来之后呢?我怀疑这正是你需要做的.

usingFlipDataSet方法中删除块,然后在返回DataSet的调用代码中处理它,最好将其包装在一个using块中.