Сборка мусора и синтаксис свойств

#c# #.net #garbage-collection

#c# #.net #сборка мусора

Вопрос:

У меня есть класс, которому нужна информация из XML-файла. У меня есть другой класс, который создан для удовлетворения этой потребности. Как только требуемая информация будет в первом классе, я хочу, чтобы средство чтения xml собирало мусор.

Теперь средство чтения xml получает необходимую информацию и сохраняет ее в закрытых полях. Первый класс запрашивает эти поля и извлекает информацию. Я знаю, что если я запрашиваю поля с использованием функций, предоставляемых в программе чтения xml, остаточной связи не будет, будет ли это также иметь место, если я использую свойства в программе чтения xml?

 public float Var
{
    get { return someVar; }
    set { someVar = value; }
}
  

Комментарии:

1. Является ли средство чтения XML переменной-членом другого класса? Или это локальная переменная в области метода-члена?

2. Класс XmlReader вызывается из конструктора вызывающего класса. Если бы я использовал прямые функции для получения переменных, хранящихся в XmlReader, я был бы уверен, что все ссылки на XmlReader будут потеряны после завершения работы вызывающего конструктора класса. Чего я не знаю, так это того, действует ли синтаксис свойств для связывания переменной в вызывающем классе с переменной в XmlReader… т.е. Сохраняет ссылку.

Ответ №1:

Не совсем понятен ваш вопрос. Вы можете использовать XmlReader в using, если хотите разрешить сбор мусора для этого экземпляра после обработки вашего XML-файла. Присвоение свойств частным переменным, как вы сказали, звучит правильно. GC может собирать экземпляр XmlReader, если нет живых ссылок. Вы могли бы попробовать приведенный ниже пример.

используя оператор, определяет область, за пределами которой будет находиться объект или объекты. Рекомендуется вызывать метод Dispose для таких объектов, как XmlReader, у которых есть обработчики файлов.

    var myProperties;

    using (XmlReader reader = XmlReader.Create("file1.xml"))
    {
        while (reader.Read())
        {
                // myProperties = reader.....;
            }
        }
    }
  

Приведенный выше код — хороший способ проверить, есть ли какие-либо проблемы со сборкой мусора, потому что он в любом случае вызовет исключение, если вы попытаетесь передать свойства XmlReaders вне инструкции using. Если вы присвоили значения частным переменным, все должно быть в порядке.

Ответ №2:

Если у вас есть ссылка на XmlReader (например, в поле вашего класса), она не может быть собрана мусором, пока экземпляр-владелец все еще жив.

Как только у вас не будет никаких ссылок на него, он будет собран для сбора мусора.

Комментарии:

1. Я думаю, вы говорите мне, что синтаксис свойств действует как ссылка, и поэтому, пока переменная в вызывающем классе, которая заполняется значением через синтаксис свойств из XmlReader, жива, так же будет и XmlReader.

2. @StephenJones: Неправильно. Свойство — это просто метод с именем get_Var ; это не имеет никакого значения для GC.

3. Я думаю, нам нужен окончательный ответ на этот вопрос. Насколько я понимаю, синтаксис свойств — это не просто метод с именем get_Var, потому что все методы используют стек и несут накладные расходы, избежать которых является целью синтаксиса свойств. Но единственный способ, которым я могу понять, как это будет сделано, — это либо: a) компилятор просто связывает переменную в том виде, в каком она содержится в вызываемом классе, с вызывающим классом, либо компилятор берет копию переменной и связывает с ней вызывающий класс. Только во втором случае вызываемый класс может быть отпущен для сборки мусора.

4. @StephenJones: Вы совершенно не правы. Поверьте мне. Если вам нужны дополнительные доказательства, посмотрите в ildasm .

5. Обратите внимание, что простые методы получения обычно будут встроены дрожанием. Дрожание не знает о свойствах; это происходит независимо от того, что это за метод.