Студопедия

КАТЕГОРИИ:

АстрономияБиологияГеографияДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРиторикаСоциологияСпортСтроительствоТехнологияФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника


Длинная ссылка




Длинная слабая ссылка сохраняется после вызова метода 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


Поделиться:

Дата добавления: 2015-04-21; просмотров: 62; Мы поможем в написании вашей работы!; Нарушение авторских прав





lektsii.com - Лекции.Ком - 2014-2024 год. (0.006 сек.) Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав
Главная страница Случайная страница Контакты