Почему Bitmap вызывает правило CA2000, а Image - нет?

Есть много вопросов о том, что SO сожалеет о том, что правило анализа кода CA2000 применяется, возможно, слишком жестко к VS2010, но я, кажется, столкнулся со случаем, когда его следует применять, но это не так.

Рассмотрим следующий код:

Image srcImage = Image.FromFile(source);
Bitmap newImage = new Bitmap(newWidth, newHeight);

using (Graphics gr = Graphics.FromImage(newImage))
{
    gr.DrawImage(srcImage, new Rectangle(0, 0, newWidth, newHeight));
}
newImage.Save(destination, ImageFormat.Jpeg);

Теперь, если я запускаю Code Analysis в Visual Studio 2010 по этому поводу, он будет жаловаться на то, что newImage не удаляется (легко исправить, поместите его в другой блок с использованием), но не жалуется на srcImage (который также имеет метод Dispose() что я никогда не звоню). Кто-нибудь знает, почему Code Analysis здесь не жалуется?

2 ответа

Решение

Что ж, он должен также "жаловаться на srcImage", однако я думаю, что он не жалуется на это, потому что вы передаете его DrawImage метод "gr.DrawImage(srcImage, new Rectangle(0, 0, newWidth, newHeight));", Либо он недостаточно умен, чтобы знать, что он не будет использоваться для дальнейших действий после возврата метода, либо, возможно, он предполагал, что вы использовали его в gr экземпляр, который будет ликвидирован. В любом случае вы должны использовать using за srcImage так же, как то, что вы делаете с newImage и не следуйте анализу кода на этом.

Правила CA2000 и аналогичные / связанные CA2213 (DisposableFieldsShouldBeDisposed) и CA1001 (TypesThatOwnDisposableFieldsShouldBeDisposable) довольно строги относительно того, как они распознают "владение" одноразовым. Они будут считать ваш код владельцем одноразового экземпляра, только если конструктор экземпляра используется для создания экземпляра непосредственно в вашем коде. Поскольку вы используете Image.FromFile для создания экземпляра для srcImage, правило не распознает ваш код как владельца.

Если вы не согласны с этим поведением правила, вы можете создать отчет об ошибке по адресу https://connect.microsoft.com/visualstudio/feedback. (Если вам небезразличны правила одноразового поля, вы можете проголосовать за существующее https://connect.microsoft.com/VisualStudio/feedback/details/485291/typesthatowndisposablefieldsshouldbedisposable-rule-ca1001-is-too-permissive предложение, пока вы на это.)

Другие вопросы по тегам