gpt4 book ai didi

c# - 处理对象的代码分析友好方式

转载 作者:太空狗 更新时间:2023-10-29 20:08:22 24 4
gpt4 key购买 nike

作为 Visual Studio 2010(主要是 C# 4.0)开发标准的一部分,我们启用了代码分析。当我审查最近为一个新项目提交的代码时,我看到了很多

CA2000 : Microsoft.Reliability: In method 'XYZ', object 'ABC' is not disposed along all exception paths. Call System.IDisposable.Dispose on object 'ABC' before all references to it are out of scope.

警告。问题是我所做的一切似乎都无法消除警告 - 我已经花了数小时搜索网络并尽我所能。

首先,让我明确一点,我不是在谈论放入一个简单的 using block 来正确处理局部变量——这不是问题。在我的例子中,当对象由方法返回或分配给方法内的另一个对象时,会出现这些警告。

这是一个包含四个此类警告的代码示例:

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;
}

我已经对出现警告的行进行了注释。

我已尝试按照 MSDN 文章 (here) 中的描述重构这两种 Create 方法,但警告仍然出现。

更新我应该注意到 SomeObject 和 SomeOtherObject 都实现了 IDisposable。

此外,虽然对象初始值设定项可能是问题的一个组成部分,但请记住初始值设定项与两个私有(private)方法隔离并且与 MainMethod 中的警告无关。

谁能告诉我如何正确实现这些方法来消除 CA2000 警告?

最佳答案

在这种情况下,CA2000 检测到的问题是,如果在将实例传递出方法之前发生异常,则一次性实例可能会被“孤立”。例如,CreateFirstObject 的“正确”实现应如下所示:

private SomeObject CreateFirstObject()
{
var theObject = new SomeObject();
try
{
theObject.FirstProperty = "some value";
}
catch
{
theObject.Dispose();
throw;
}

return theObject;
}

鉴于您所描述的有关 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;
}
}

关于c# - 处理对象的代码分析友好方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8245138/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com