использование инициализатора объекта генерирует предупреждение CA 2000 - PullRequest
1 голос
/ 05 января 2012

Следующий код генерирует предупреждение CA2000:

Myclass myclass = null;
try
{
   myclass = new Myclass { Name = "a name" };
}
finally
{
   if (myclass != null)
   {
      myclass.Dispose();
   }
}

Я нашел несколько тем с такой же проблемой, и, насколько я понимаю, проблема в том, что компилятор генерирует для конструктора временную переменную, а для этой переменной Iя не вызываю Dispose ().

var tmp = new MyClass();
tmp.Name = "a name";
myclass = tmp:

, поэтому мой вопрос, если есть решение с использованием инициализатора объекта, которое не генерирует предупреждение ca2000.

спасибо заранее.

1 Ответ

0 голосов
/ 05 января 2012

Как отмечает Дэмиен в комментариях, предупреждение FxCop является действительным, поскольку компилятор C # создает экземпляр IDisposable в скрытой переменной temp, а также при возникновении исключения во время инициализации одного из свойств, которыеэкземпляр не будет утилизирован.

При хорошем дизайне API это не будет проблемой, поскольку ресурсы (вещи, которые реализуют IDisposable) должны содержать Open (или Begin, Start,в любом случае) (в соответствии с Руководством по проектированию структуры), и не должен течь до вызова Open.Это правило создано по той же причине, что и вы: предотвратить утечку при инициализации.FDG были написаны до C # 3.0, но та же проблема существует, когда исключение выдается из конструктора этого экземпляра (что всегда может произойти из-за асинхронных исключений, таких как прерывание потока).Поскольку ссылка на экземпляр в этот момент не публикуется, никто не может распоряжаться этим экземпляром.Поэтому не рекомендуется инициализировать базовые ресурсы во время построения.

Таким образом, вы можете безопасно отменить это предупреждение, когда Myclass содержит какой-то метод Open, и когда вы не инициализируете его значениями, которые реализуют IDisposable сами.В других случаях вам следует вернуться к следующему:

var myclass = new MyClass();

try
{
    myclass.Name = "a name";
}
finally
{
    myclass.Dispose();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...