Почему Bitmap вызывает правило CA2000, а Image - нет? - PullRequest
6 голосов
/ 07 августа 2011

Есть много вопросов о том, что 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 ]

5 голосов
/ 08 августа 2011

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

0 голосов
/ 07 августа 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...