Обычный способ избежать предупреждения CA2000 о неразмещенных локальных компьютерах - это использовать временную переменную, которая удаляется, если что-то идет не так, как:
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 очень нужно), но если есть реальный способ устранить проблему, я бы предпочел это сделать.