Рассмотрим следующий код:C# вызова IDisposable.Dispose() против создания объекта Null
А. Игрушка класса
class Toy
{
private string name;
public string Name
{
get { return name; }
set { name = value; }
}
private ToyAddon addOn;
public ToyAddon AddOn
{
get { return addOn; }
set { addOn = value; }
}
public void RemoveAddons()
{
/*
* someone said: this could lead to possible memory leak
* if this class implements IDisposable,
* then we are not disposing any of the resource
* */
//this.addOn = null;
/* instead use this */
var disposableToyAddOn = this.addOn as IDisposable;
if (disposableToyAddOn != null)
disposableToyAddOn.Dispose();
this.addOn = null;
}
public override string ToString()
{
return String.Format("{0}, {1}",
this.name,
(this.AddOn == null) ? "" : addOn.AddOnName);
}
}
B. Игрушка Аддон
class ToyAddon
{
private string addOnName;
public string AddOnName
{
get { return addOnName; }
set { addOnName = value; }
}
}
C. Основная программа
class Program
{
static void Main(string[] args)
{
ToyAddon tAdd = new ToyAddon();
tAdd.AddOnName = "Amazing AddOn";
Toy t = new Toy();
t.Name = "Amazing Toy";
t.AddOn = tAdd;
t.RemoveAddons();
Console.WriteLine(t.ToString());
}
}
Теперь было предложено d, чтобы проверить, реализует ли объект «having-a» IDisposable, затем вызвать метод dispose. (пожалуйста, ознакомьтесь с комментариями в Toy class)
IMHO, если я сделаю ссылку нулевой, то объект в куче будет помечен для Collection by GC.
Было бы понятно, если бы эти рассуждения могут быть сделаны на то, что происходит на куче и стека, а также роль GC в том, что если класс (как ToyAddOn) реализует IDisposable против, если он не делает.
Я рекомендую действительно хорошее сообщение в блоге Стивена Клири "[IDisposable: Что ваша мать никогда не говорила вам о освобождении ресурсов) (http://www.codeproject.com/Articles/29534/IDisposable-What-Your-Mother -Никогда-Told-You-О)». Вероятно, вам понадобится около часа, чтобы прочитать, но вы узнаете много, и у вас будет намного лучшее понимание, почему ваш коллега рассказал вам, что он сказал вам. –
Это не полный, и не такой простой. Вам нужен «контракт», в котором говорится, что Toy «владеет» AddOn и что AddOns нельзя использовать повторно. Один из способов выразить это - переименовать RemoveAddons -> DestroyAddons –
downvote без причины !! Strange –