C # - изменение ссылки на неуправляемый объект - PullRequest
0 голосов
/ 14 сентября 2018

Итак, давайте создадим ссылку на неуправляемый объект ...

RandomObject x;

И затем я назначу эту ссылку на неуправляемый объект.

x = new RandomObject(argX, argY);

Но позже я решаю, что хочу, чтобы x ссылался на другой экземпляр этого объекта:

x = new RandomObject(argZ, argV);

Что происходит в этом случае?"New RandomObject (argX, argY)" удаляется, когда я переназначаю x другому экземпляру неуправляемого объекта?Или я должен сам распоряжаться им перед переназначением?Что я спрашиваю, так это время жизни этого объекта.

1 Ответ

0 голосов
/ 14 сентября 2018

В 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");
}
...