Кто объяснит(c#)?!?
test.ht не приравнивается к null, а сохраняет своё значение.
<CODE>
class test
{
public test()
{
ht = new Hashtable();
ht.Add("1", 1);
ht.Add("2", 2);
}
public void func(Hashtable t)
{
t.Add("3", 3);
t = null;
}
public Hashtable ht;
}
class Program
{
static void Main(string[] args)
{
test m = new test();
Console.WriteLine(m.ht.Count);
m.func(m.ht);
Console.WriteLine(m.ht.Count);
Console.ReadKey();
}
}
</CODE>
...
public void func(ref Hashtable t)
{
t.Add("3", 3);
t = null;
}
...
static void Main(string[] args)
{
test m = new test();
Console.WriteLine(m.ht.Count);
m.func(ref m.ht);
Console.WriteLine(m.ht.Count);
Console.ReadKey();
}
Хотя, конечно, странный код! Зачем в хеш-таблицу добавлять элементы, чтоб потом сразу занулить ссылку на него?! Его же сражу Garbage Collector "заметет"...
ну а программа, по идее просто тестовая, учебная, человек просто балуется )
а фигня такая в программе получается из-за того, что t -- это только копия ссылки на объект. и когда ты пишешь t = null, то ты на самом деле обнуляешься не объект, а только одну из ссылок на него. при этом на сам объект это никак не влияет
Согласен, в .NET сборщик несколько странный :) . А в .NET Compact Framework еще хуже - похоже он реально удаляет все объекты только после завершения приложения...
Цитата: ikro
Согласен, в .NET сборщик несколько странный :) . А в .NET Compact Framework еще хуже - похоже он реально удаляет все объекты только после завершения приложения...
В .NET сборщик нормальный, просто ссылок на объекты значит много либо по каким-либо причинам попали в 3 поколение объектов (обычно это статические поля). Не забываем пользоваться финализаторами, IDisposable и профайлером для выявления кода, который держит активные ссылки. Сборщик мусора ВСЕГДА удаляет объекты со слабыми ссылками!