Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > C# (си шарп)
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 04.09.2013, 15:55   #1
rata
Новичок
Джуниор
 
Регистрация: 04.09.2013
Сообщений: 2
По умолчанию CA2000 Dispose objects before losing scope

Доброго времени суток.
Есть вот такой кусочек кода (сам кусочек пока не делает всего что нужно, но это не важно - суть в нем есть некая работа с Bitmap которую потом надо вернуть в Frame'е):
Код:
private Frame MakeFrameFromChildNode(XmlNode node, ref string log)
        {
 
            Bitmap tempFrame = null;
 
            try
            {
                tempFrame = new Bitmap(_resolutionX, _resolutionY);
 
                if (node.Name == "frame")
                {                      
                    foreach (XmlNode frameChildNode in node.ChildNodes)
                    {
                        PlacePictureFromTagOnBitmap(frameChildNode);
                    }             
                }
                else
                {
                    log += string.Format("{0} Обнаружен неизвестный тэг {1}. Его содержимое игнорируется.\n", DateTime.Now.ToString("[hh:mm:ss]"),node.Name);
                }
 
                var result = tempFrame;
                tempFrame = null;
                return new Frame(result, 0);
            }
            finally
            {
                if (tempFrame != null) tempFrame.Dispose();
            }            
        }
Где Frame это класс для передачи аргументов:
Код:
using System.Drawing;
 
namespace BitmapBuilder
{
    public sealed class Frame
    {
        private readonly Bitmap _bitmap;
        private readonly double _duration;
 
        public Frame(Bitmap bitmap, double duration)
        {
            _duration = duration;
            _bitmap = bitmap;
        }
 
        public Bitmap Bitmap
        {
            get { return _bitmap; }
        }
 
        public double Duration
        {
            get { return _duration; }
        }
    }
}
Суть проблемы: компилятор выдает варнинг на tempFrame
Цитата:
CA2000 Dispose objects before losing scope In method 'XmlToBitmapConverter.MakeFrameFrom ChildNode(XmlNode, ref string)', call System.IDisposable.Dispose on object 'tempFrame' before all references to it are out of scope.
В случае если функция MakeFrameFromChildNode возвращает тупо Bitmap проблем не возникает, а как быть если мне нужно вернуть именно экземпляр моего класса? Возвращать Bitmap не вариант т.к. это используется и в других местах, в том числе для передачи через Wcf.

Помогите пофиксить. Спасибо.

Последний раз редактировалось Stilet; 04.09.2013 в 16:14.
rata вне форума Ответить с цитированием
Старый 04.09.2013, 16:09   #2
Luuzuk
Форумчанин
 
Аватар для Luuzuk
 
Регистрация: 18.01.2012
Сообщений: 975
По умолчанию

Диспозить битмап не надо, вы же его потом использовать будете (на него в Frame ссылка остается)
Благодарить в репутацию. Проклинать — туда же
Luuzuk вне форума Ответить с цитированием
Старый 04.09.2013, 16:16   #3
rata
Новичок
Джуниор
 
Регистрация: 04.09.2013
Сообщений: 2
По умолчанию

Да, в том то и дело. Но варнингов быть не должно, это обязательное условие.
Вот взгляните:

private Bitmap ProcessBitmap(Bitmap sourceBitmap)
{
Contract.Requires(sourceBitmap != null);

Bitmap temp = null;

try
{
temp = new Bitmap(sourceBitmap);


for (var pixelIndexX = 0; pixelIndexX < temp.Width; pixelIndexX++)
for (var pixelIndexY = 0; pixelIndexY < temp.Height; pixelIndexY++)
{
var bestColor = CalculateMatchingColor(pixelIndexX, pixelIndexY, temp);
SaveNewPixel(pixelIndexX, pixelIndexY, bestColor, temp);
}

var result = temp;
temp = null;
return result;
}
finally
{
if (temp != null)
{
temp.Dispose();
}
}
}

Сходный кусочек кода, изначально я использовал в нем банальный using, но потом нашел на msdn такой вот пример как избежать варнинга, создавая копию непосредственно перед возвратом.

Не могу понять как добиться подобного тут.
rata вне форума Ответить с цитированием
Старый 04.09.2013, 16:57   #4
Luuzuk
Форумчанин
 
Аватар для Luuzuk
 
Регистрация: 18.01.2012
Сообщений: 975
По умолчанию

Варнинг о того, что у вас бред написан.

Код:
private Bitmap ProcessBitmap(Bitmap sourceBitmap)
{
Contract.Requires(sourceBitmap != null);
Bitmap temp = new Bitmap(sourceBitmap);
for (var pixelIndexX = 0; pixelIndexX < temp.Width; pixelIndexX++)
for (var pixelIndexY = 0; pixelIndexY < temp.Height; pixelIndexY++)
{
var bestColor = CalculateMatchingColor(pixelIndexX, pixelIndexY, temp);
SaveNewPixel(pixelIndexX, pixelIndexY, bestColor, temp);
}
return temp;
}
Вот так оставьте и будет щастье.

Цитата:
создавая копию непосредственно перед возвратом
У вас копия не создается нигде. Только ссылки на объект бесполезным образом из одной переменной в другую кочуют
Благодарить в репутацию. Проклинать — туда же
Luuzuk вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
не работает dispose MYriad Помощь студентам 1 02.10.2011 14:19
abc was not declared in this scope Farrel Qt и кроссплатформенное программирование С/С++ 2 21.04.2011 17:56
error: was not declared in this scope Serjuk Помощь студентам 2 29.03.2011 15:59
Почему Dispose не освобождает память? DeLorean Общие вопросы Delphi 4 08.04.2008 00:17