以下代码生成两个CA2000警告(除此之外,但这不是重点).
public sealed class Item: IDisposable
{
public void Dispose() {}
}
public sealed class ItemContainer
{
public void Add(Item item)
{
}
}
public sealed class Test: IDisposable
{
private ICollection<Item> itemCollection;
private ItemContainer itemContainer;
private void Add(Item item)
{
itemCollection.Add(item);
}
public void Initialize()
{
var item1 = new Item(); // no warning
itemCollection.Add(item1);
var item2 = new Item(); // CA2000: call Dispose on object item2
Add(item2);
var item3 = new Item(); // CA2000: call Dispose on object …Run Code Online (Sandbox Code Playgroud) 我很高兴编写了一个工作正常的项目,并没有在运行时表现出任何奇怪的东西.所以我决定运行静态代码分析工具(我使用的是Visual Studio 2010).据说CA2000违反了规则,信息如下:
警告 - CA2000:Microsoft.Reliability:在方法'Bar.getDefaultFoo()'中,在对所有引用超出范围之前,在对象'new Foo()'上调用System.IDisposable.Dispose.
引用的代码如下:
private static IFoo getDefaultFoo()
{
return (Baz.canIDoIt()) ? new Foo() : null;
}
Run Code Online (Sandbox Code Playgroud)
我想自己:也许条件表达会破坏逻辑(我的或验证者).改为:
private static IFoo getDefaultFoo()
{
IFoo ret = null;
if (Baz.canIDoIt())
{
retFoo = new Foo();
}
return ret;
}
Run Code Online (Sandbox Code Playgroud)
同样的事情再次发生,但现在这个对象被称为retFoo.我用谷歌搜索了,我已经知道了,我已经堆叠了.找到这篇文章.创建对象后,我无需执行任何操作.我只需要返回它的引用.但是,我尝试应用OpenPort2示例中建议的模式.现在代码如下所示:
private static IFoo getDefaultFoo()
{
Foo tempFoo = null;
Foo retFoo = null;
try
{
if (Baz.canIDoIt())
{
tempFoo = new Foo();
}
retFoo= tempFoo;
tempFoo = null;
}
finally
{ …Run Code Online (Sandbox Code Playgroud) 这是我的代码,它给了我CA2000"new DataTable()..."和"new DataColumn()..."
usersDS.Tables.Add(new DataTable()
{
TableName = "Users",
Columns = { new DataColumn() { ColumnName = "Handle", DataType = typeof(string) }, new DataColumn() { ColumnName = "Nickname" ,DataType = typeof(string) } }
});
Run Code Online (Sandbox Code Playgroud)
是否可以在不声明变量的情况下进行修复?