Нет. На самом деле, вы не хотите, чтобы он собирался мусором - очень часто его запрашивает сборщик мусора.
То, что вы делаете хотите, - это своевременно распоряжаться неуправляемыми ресурсами - вот где приходит IDisposable
вместе с оператором using
:
void MyFunction()
{
using (Bitmap image = RetrieveImage())
{
DoSomething(image);
}
}
Это вызовет image.Dispose()
при выходе из оператора using
, вне зависимости от того, выдало ли DoSomething
исключение.
Вы должны использовать дополнительную переменную, хотя - если вы не измените DoSomething
вместо Func<Bitmap>
, вместо:
void DoSomething(Bitmap image)
{
// Code here
}
...
DoSomething(RetrieveImage());
у вас будет:
void DoSomething(Func<Bitmap> imageProvider)
{
using (Bitmap image = imageProvider())
{
// Code here
}
}
...
DoSomething(() => RetrieveImage());
Обратите внимание, что это не дает возможности передать растровое изображение без его удаления - что может быть проблемой, если вы захотите использовать его позже. Тем не менее, это хорошая техника, по крайней мере, знать о ней.
РЕДАКТИРОВАТЬ: Как указал в своих комментариях mbeckish, здесь не так уж много пользы от простого использования растрового изображения в RetrieveImage
. Вот вариант на схеме:
public void ApplyToEachLineInFile(string file, Action<string> action)
{
using (TextReader reader = File.OpenText(file))
{
string line;
while ((line = reader.ReadLine()) != null)
{
action(line);
}
}
}
Здесь логика «получения и утилизации» инкапсулирована, и вызывающий ее не беспокоится об этом, но вызывающий может все же быть очень гибким с точки зрения сложности логики, которую они передают.