Почему 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 предложение, пока вы на это.)