2017-02-16 5 views
0

Мне интересно, если в данном сценарии ниже, любое ручное действие Bitmap dispose должно иметь место. Предположим, у меня есть два растровых изображения по всему миру для WinForm, A и B. Предположим, я хочу сделать некоторые операции преобразования/смешивания на их соответствующих изображениях, но хочу сделать это на копиях. Я стремлюсь вызвать функцию преобразования (Bitmap Transform(Bitmap first, Bitmap second)) аналогично этому:C# manual-Dispose -of -an -IDisposable semantics

var newB = Transform((Bitmap)A.Clone(), (Bitmap)B.Clone()). 

Когда это сделано в Transform, я распоряжаться A и B копий в трансформации? Я копирую перед вызовом, а затем удаляю после возвращения? Поскольку эти ссылки абсолютно потеряны после возвращения Transform, могу ли я доверять GC?

-EDIT_ ДОБАВЛЕНИЕ комментария от BELOW_-

Что касается возможного дублирования, я видел этот пост, но не было никаких примеров использования аргументов, созданных во время вызова. Я хотел знать, есть ли у пройденных объектов никакого дома в области вызова, если бы был способ распоряжаться, если нужно было распоряжаться, или если дом должен быть предоставлен для надлежащей обработки удаления. Кажется, что создание одноразовых объектов без возможности распоряжаться ими в области создания не рекомендуется из того, что я собираю здесь. -

Кроме того, я могу подтвердить, что решение Мартина эффективно, хотя клоны в теле преобразования оказались наиболее организованными и чистыми. Только один из клонов должен был быть удален, так как я использовал его как объект, на который ссылается обратное. Наконец, клон был необходим, так как обновление любого изображения в виде изображения генерирует исключение, если его изображение находится в режиме чтения битблока, как это необходимо для преобразования. Спасибо за помощь. Все

+0

Возможный дубликат [Кто должен вызывать Dispose на IDisposable объектов при передаче в другой объект?] (Http://stackoverflow.com/questions/4085939/who-should-call-dispose-on-idisposable-objects -when-pass-into-another-object) – dlatikay

+0

Не совсем очевидно, как эти растровые изображения могут пострадать в процессе. Clone() не защищает от этого. Но в целом, да, если вы Clone(), то вам тоже нужно будет уничтожить клон. Или вы будете течь, когда пришло время распоряжаться A и B. Вызов Dispose() внутри Transform() с отправленным кодом является серьезной ошибкой, всегда должно быть очевидно, кто является владельцем объекта. Если вы действительно, * действительно * нужно вызвать Clone(), вы наверняка не будете этого делать, поскольку ничего не делает, тогда это нужно сделать внутри Transform(). И тогда вы будете использовать инструкцию * using *. –

+0

Итак, позвольте мне быстро протянуть мотив клонов, а потом, может быть, вы можете подтвердить, что это не нужно? Битовые карты A и B отображаются активным PictureBox. Если бы мне пришлось блокировать растровые изображения в Transform, не говоря уже о внесении каких-либо изменений, то это недействило бы ссылку на PictureBox или, по крайней мере, изменило бы изображение в виде изображения, поскольку любые изменения сделаны в преобразовании? Будет ли приостановлено управление освещением в таком случае? Наверное, я не уверен, насколько тесно связаны объекты Windows Form с любыми переменными, которые они используют для постоянного GUI. – schulmaster

ответ

0

Сборщик мусора автоматически не вызывается Dispose об объектах, реализующих IDisposable. Это произойдет только в том случае, если их классы переопределили финализатор и обеспечили, что вызывается Dispose. См. documentation here.

Обычно наилучшим подходом является создание экземпляров одноразовых объектов в блоке using.

using (var bitmapA = (Bitmap)A.Clone()) 
using (var bitmapB = (Bitmap)B.Clone()) 
{ 
    var newB = Transform(bitmapA, bitmapB); 
} 
+0

Это успешно ответили на мой вопрос, но, как оказалось, я задавал вопрос, который мог бы привести к множеству плохих практик. все равно согласится. – schulmaster