![]() КАТЕГОРИИ:
АстрономияБиологияГеографияДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРиторикаСоциологияСпортСтроительствоТехнологияФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника
|
Длинная ссылкаДлинная слабая ссылка сохраняется после вызова метода Finalize объекта. Это позволяет повторно создавать объект, однако состояние объекта остается непредсказуемым. Чтобы использовать длинную ссылку, укажите значение true в конструкторе WeakReference. Если тип объекта не имеет метода Finalize, используется функциональность краткой слабой ссылки, а сама слабая ссылка становится допустимой только до сборки цели, что может произойти в любое время после запуска метода завершения. Чтобы установить строгую ссылку и повторно использовать объект, приведите свойство Target объекта WeakReference к типу объекта. Если свойство Target возвращает значение null, объект был собран; в противном случае можно продолжить использование объекта, так как приложение восстановило строгую ссылку на этот объект. Правила использования слабых ссылок Используйте длинные слабые ссылки только при необходимости, так как состояние объекта после выполнения завершения становится непредсказуемым. Избегайте использования слабых ссылок на небольшие объекты, потому что сам указатель может быть таким же по объему или даже больше. Избегайте использования слабых ссылок в качестве автоматического решения проблем, связанных с управлением памятью. Вместо этого разработайте эффективную политику кэширования для обработки объектов приложения. Пример
class Class1 { class TestClass { public override string ToString() { return "Test Object No " + objectNo; } public TestClass() { objectNo++; } static int objectNo = 0; }
// «слабая» ссылка WeakReference wr = new WeakReference(null);
// Возвращает ссылку на объект, // при необходимости создаёт новый TestClass GetRef() { // Если объект уже создан и всё ещё жив, // то мы можем получить ссылку на него через Target TestClass tc = (TestClass)wr.Target; if (tc == null) { tc = new TestClass(); wr.Target = tc; } return tc; }
public void Test() { // Получаем ссылку на объект object obj = GetRef();
// Вызываем сборщик мусора, // но объект не будет удалён, // т.к. существует «сильная» ссылка obj GC.Collect();
// Печатаем "Test Object No 1" Console.WriteLine(GetRef());
// удаляем «сильную» ссылку obj = null;
// Печатаем опять "Test Object No 1", // т.к. сборщик мусора не вызывался и мы можем // получить объект через «слабую» ссылку Console.WriteLine(GetRef());
// Вызываем сборщик мусора ещё раз GC.Collect();
// На этот раз печатаем "Test Object No 2", // сборщик мусора удалил старый объект, // и вызова GetRef создаст новый Console.WriteLine(GetRef()); } } Вопрос № 17
|