【发布时间】:2011-07-19 17:14:28
【问题描述】:
避免 CA2000 警告关于 non-disposed locals 的正常模式是使用一个临时变量,如果出现任何问题,该变量就会被释放,例如:
Foo f = null;
try
{
f = new Foo();
Foo result = f;
f = null;
return result;
}
finally
{
if (f != null)
{
f.Dispose();
}
}
有点冗长,但它有效,而且很有意义。但是如何将该模式应用于链式构造函数,如下所示:
public HomeController ( IDataRepository db )
{
this.repo = db ?? new SqlDataRepository();
}
public HomeController ( )
: this(new SqlDataRepository())
{
}
此代码抛出两个 CA2000 警告,每个构造函数一个。第一个我可以摆脱使用临时变量模式。这很烦人,因为本地在构建之后但在分配给成员字段之前没有任何方法超出范围,稍后会清理。所以我不知道 CA 的问题是什么,但至少我知道如何解决它。
但是,据我所知,没有任何替代方法可以编写第二个构造函数调用来引入 try/finally。分配给的字段是只读的,因此必须在构造函数中设置。 C# 不允许你在任何地方调用链式构造函数,而是在构造函数体之前。而且,在这两个警告中,第二个警告实际上更合理——对链式构造函数的调用可能(理论上,如果它确实做了任何实际工作)会抛出异常,并且不会处理新构造的参数。
当然,我总是可以直接隐藏此消息(CA2000 似乎需要很多),但如果有消除问题的实际方法,我更愿意这样做。
【问题讨论】:
-
IMO,这是一个 CA 错误。
标签: c# visual-studio-2010 code-analysis fxcop