Как отмечает Дэмиен в комментариях, предупреждение 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();
}