Вы правы, память автоматически освобождается, когда процесс завершается. Некоторые люди стараются не проводить тщательную очистку, когда процесс завершается, так как все они будут оставлены в операционной системе. Однако, пока ваша программа работает, вы должны освободить неиспользуемую память. Если вы этого не сделаете, вы можете закончиться или вызвать чрезмерный пейджинг, если ваш рабочий набор становится слишком большим.
(редактировать - неправильно прочитанный вопрос)
Если вы хотите получить исходный объект , GetHashCode ()
версия; вы не можете - по крайней мере, если только A
не сделает его доступным через что-то вроде:
protected int GetBaseHashCode() { return base.GetHashCode();}
(и не имеет B
call GetBaseHashCode ()
).
Причина переполнения в том, что GetHashCode
(очевидно) виртуальный - не имеет значения, приведете ли вы его к объекту
; он по-прежнему начинается с самой производной реализации в реальном объекте, то есть B.GetHashCode ()
(отсюда и взрывной рост).
Вы можете использовать RuntimeHelpers.GetHashCode (object)
, чтобы получить исходный хэш-код объекта:
class A
{
public override int GetHashCode()
{
Console.WriteLine("base hashcode is: " + base.GetHashCode());
return 1;
}
}
class Program
{
public static void Main(string[] args)
{
A a = new A();
Console.WriteLine("A's hashcode: " + a.GetHashCode());
Console.WriteLine("A's original hashcode: " + RuntimeHelpers.GetHashCode(a));
}
}
Это дает следующий результат:
базовый хэш-код : 54267293
Хэш-код A: 1
Исходный хэш-код A: 54267293
Если вы посмотрите на RuntimeHelpers.GetHashCode (object)
в Reflector, вы увидите, что он вызывает внутренний статический метод object.InternalGetHashCode (object)
. Если вы хотите узнать больше, просмотрите этот вопрос относительно реализации GetHashCode по умолчанию.