当前位置: 代码迷 >> C# >> 在using话语里使用构造器会报CA2000,误报还是这个写法确实有风险
  详细解决方案

在using话语里使用构造器会报CA2000,误报还是这个写法确实有风险

热度:47   发布时间:2016-05-05 04:37:12.0
在using语句里使用构造器会报CA2000,误报还是这个写法确实有风险?
在工程属性里启用了代码分析,下边的第一个写法能通过;第2个写法会有一个警告:


            using (var form = new Form()) //ok
            {
                form.Location = new Point(100, 100);
                form.ShowDialog();
            }

            using (var form = new Form {Location = new Point(100, 100)}) //CA2000
            {
                form.ShowDialog();
            }


具体提示:
CA2000 丢失范围之前释放对象
在方法 'MyClass1.a()' 中,'<>g__initLocal0' 对象未按所有异常路径释放。请在对 '<>g__initLocal0' 对象的所有引用超出范围之前,对该对象调用 System.IDisposable.Dispose。
------解决思路----------------------
这是因为第二种写法生成的代码差不多是这样:

var form2 = new Form();
form2.Location = new Point(100, 100);
using (var form = form2)
{
    form.ShowDialog();
}
它报的是这个临时的form2在丢失范围之前没有释放。实际上form和form2是一个东西,而且那样写这个临时的form2在using之外也没法直接使用,所以这个警告可以忽略。
  相关解决方案