将dataview包装在using语句中会产生奇怪的结果。我滥用了吗?

时间:2014-07-29 16:41:53

标签: c# dataview using-statement

这个问题今天真的让我感到困惑。我正在使用Visual Studio 2012,C#.net 4应用程序(不确定是否重要)。

我有一些数据表,其中包含多个结果。为了找到最好的选择,我正在寻找具有最佳Ja​​ro-Winkler得分的那个,并将其送回去。
我通过制作数据视图对表格结果进行排序,并试图正确处理我的数据元素,我将数据视图包装在一个使用的语句中。代码如下所示:

 public static DataRow getBestCandidate(DataTable searchTable, string searchName)
        {
            if (searchTable.Rows.Count == 1) //Nothing to do if there's only one row
            {
                return searchTable.Rows[0];
            }        

           int tableSize = searchTable.Rows.Count;
                for (int i = 0; i < tableSize; i++)
                {
                        //Iterate through each entry and record the Jaro distance between our original search term.
                        searchTable.Rows[i][7] = jaro.getScrubbedDistance(searchTable.Rows[i][1].ToString(), searchName);
                }

                using (DataView dv = searchTable.DefaultView) //Sort the results
                {
                    dv.Sort = "JaroDistance desc";                 
                    return dv[0].Row; //Send back the result with the highest Jaro score.
                }          
        }

这就是奇怪的。我第一次打电话给它,它运作得很好。正如我所希望的那样。 如果我从同一个方法连续两次调用它,它几乎可以第二次工作。当运行跟踪时,它一直到“return dv [0] .Row;”行,当它执行时,对象DV为空。它的行为与我完成之前处理的对象完全相同。最终会以异常方式杀死该线程。

我拿出了使用声明并将其替换为:

 DataView dv = searchTable.DefaultView;
                    dv.Sort = "JaroDistance desc";

                    return dv[0].Row;

然后它工作得很好。锤击这些方法似乎并没有造成巨大的内存峰值。

是否需要使用包装?为什么它在我返回之前变为空?

1 个答案:

答案 0 :(得分:1)

假设searchTable是同一个实例,那么每次调用方法时,都会丢弃它所共享的DefaultView对象。

此处不需要using,而是在任何父方法管理该对象的searchTable周围。