В C # сборщик мусора будет управлять всеми объектами и освобождать память любых объектов, на которые больше нет ссылок.
Используя ваш пример:
RandomObject x;
// A RandomObject reference is defined.
x = new RandomObject(argX, argY);
// Memory is allocated, a new RandomObject object is created in that memory location,
// and "x" references that new object.
x = new RandomObject(argZ, argV);
// Memory is allocated, a new RandomObject object is created in that memory location,
// and "x" references that new object. The first RandomObject object no longer has
// any references to it and will eventually be cleaned up by the garbage collector.
Неуправляемые ресурсы
Несмотря на то, что все объекты в C # являются управляемыми, существуют «неуправляемые ресурсы», такие как открытые файлы или открытые соединения.Когда объект с неуправляемым ресурсом выходит из области видимости, он будет собирать мусор, но сборщик мусора не будет освобождать эти неуправляемые ресурсы.Эти объекты обычно реализуют IDisposable
, что позволяет вам утилизировать ресурс до его очистки.
Например, в классе StreamWriter
есть неуправляемый ресурс, который открывает файл и записывает в него,
Вот пример сбоя при освобождении неуправляемого ресурса:
// This will write "hello1" to a file called "test.txt".
System.IO.StreamWriter sw1 = new System.IO.StreamWriter("test.txt");
sw1.WriteLine("hello1");
// This will throw a System.IO.IOException because "test.txt" is still locked by
// the first StreamWriter.
System.IO.StreamWriter sw2 = new System.IO.StreamWriter("test.txt");
sw2.WriteLine("hello2");
Чтобы правильно освободить файл, вы должны сделать следующее:
// This will write "hello1" to a file called "test.txt" and then release "test.txt".
System.IO.StreamWriter sw1 = new System.IO.StreamWriter("test.txt");
sw1.WriteLine("hello1");
sw1.Dispose();
// This will write "hello2" to a file called "test.txt" and then release "test.txt".
System.IO.StreamWriter sw2 = new System.IO.StreamWriter("test.txt");
sw2.WriteLine("hello2");
sw2.Dispose();
К счастью, объекты, которыеИнструмент IDisposable
может быть создан в операторе using
, тогда, когда он выйдет из области видимости, Dispose()
будет автоматически вызван для него. Это лучше, чем ручной вызов Dispose (как в предыдущем примере), потому что если в блоке using были какие-либо неожиданные точки выхода, вы можете быть уверены, что ваш ресурс был освобожден.
using (System.IO.StreamWriter sw1 = new System.IO.StreamWriter("test.txt"))
{
sw1.WriteLine("hello1");
}
using (System.IO.StreamWriter sw2 = new System.IO.StreamWriter("test.txt"))
{
sw2.WriteLine("hello2");
}