Son*_*ate 7 .net c# code-analysis idisposable static-code-analysis
作为Visual Studio 2010(主要是C#4.0)开发标准的一部分,我们启用了代码分析.当我正在审查最近为新项目提交的代码时,我看到了很多
CA2000:Microsoft.Reliability:在方法'XYZ'中,对象'ABC'不沿所有异常路径放置.在对所有引用超出范围之前,调用System.IDisposable.Dispose对象'ABC'.
警告.问题是,我所做的一切似乎都没有消除警告 - 我花了几个小时搜索网络并尽我所能.
首先,让我明确一点,我不是在谈论将一个简单的使用块放入正确处理局部变量 - 这不是问题.在我的情况下,当对象由方法返回或分配给方法中的另一个对象时,会出现这些警告.
这是一个代码示例,其中包含四个此类警告:
public void MainMethod()
{
var object1 = CreateFirstObject(); // Warning here
var object2 = CreateSecondObject(); // Warning here
SomeCollectionProperty.Add(object1);
SomeCollectionProperty.Add(object2);
}
private SomeObject CreateFirstObject()
{
var theObject = new SomeObject() // Warning here
{
FirstProperty = "some value",
// ...
};
return theObject;
}
private SomeOtherObject CreateSecondObject()
{
var theObject = new SomeOtherObject() // Warning here
{
FirstProperty = "a different value",
// ...
};
return theObject;
}
Run Code Online (Sandbox Code Playgroud)
我已经评论了警告发生的地方.
我已经尝试重构两个Create方法,如MSDN文章(此处)中所述,但警告仍然出现.
更新 我应该注意SomeObject和SomeOtherObject都实现了IDisposable.
此外,虽然对象初始值设定项可能是问题的一个组成部分,但请记住,初始化程序与两个私有方法隔离,与MainMethod中的警告无关.
谁能告诉我如何正确实施这些方法来消除CA2000警告?
Nic*_*oiu 10
在这种情况下,CA2000正在检测的问题是,如果在将异常传递出方法之前发生异常,则一次性实例可能会"孤立".例如,CreateFirstObject的"正确"实现看起来如下所示:
private SomeObject CreateFirstObject()
{
var theObject = new SomeObject();
try
{
theObject.FirstProperty = "some value";
}
catch
{
theObject.Dispose();
throw;
}
return theObject;
}
Run Code Online (Sandbox Code Playgroud)
鉴于您所描述的有关MainMethod所需行为的内容,其"正确"实现可能如下所示:
public void MainMethod()
{
var object1 = CreateFirstObject();
try
{
SomeCollectionProperty.Add(object1);
var object2 = CreateSecondObject();
try
{
SomeCollectionProperty.Add(object2);
}
catch
{
object2.Dispose();
throw;
}
}
catch
{
object1.Dispose();
SomeCollectionProperty.Remove(object1); // Not supposed to throw if item does not exist in collection.
throw;
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4914 次 |
| 最近记录: |