Это утечка памяти или неизданные ресурсы

#c# #asp.net

#c# #asp.net

Вопрос:

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

Я десериализую XML-файл в объект. Затем я использую этот объект для заполнения некоторых свойств другого объекта. Сохраняет ли при этом этот десериализованный объект file-into-a-class где-нибудь в памяти:

  void Load() {
   MyClass deserializedClass = Helper.GetDeserializedFileFromXml(path, type);
   SetProperty(deserializedClass)
 }

 // MyProperty is a List<ADifferentClass>;
 void SetProp(MyClass myClass) {
    MyProperty = myClass.MyProperty;
 }
  

Обновить

Прочитав комментарии ниже, я понял, что решающая часть (и почему я спросил об этом) заключается в том, что свойство является ссылочным типом, списком другого класса.

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

1. Нужно намного больше cotext и кода вокруг этого, чтобы действительно понять, что происходит.

2. Является ли type of MyProperty значением или ссылкой?

Ответ №1:

Класс не должен оставаться, если только значение proprety каким-то образом не ссылается на класс. Сам файл не сохраняется (если только GetDeserializedFileFromXml не сделает что-то неожиданное).


Чтобы объяснить подробнее, если ваш класс похож на этот:

 public class MyClass {
   public String MyProperty { get; set; }
}
  

тогда присвоение свойства MyProperty не приведет MyClass к зависанию. Если, с другой стороны, это что-то вроде:

 public class MyClass {
    public MyClass() {
        MyProperty = new HoldsAReference(this);
    }
    public HoldsAReference MyProperty { get; private set; }
}
  

тогда ваш класс останется на месте.

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

1. Это меня беспокоит. когда я выполняю property = myclass.property , это присваивание, поддерживающее ссылку, заставляет класс не исчезать

Ответ №2:

Итак, ответ был утвердительным, потому что мое свойство ссылается на другое свойство classes (десериализованное из XML), которое является ссылочным типом. Десериализованный класс зависает.

Ответ №3:

Первым делом вам нужно понять, как работают типы ссылок и значений.

Отсюда следует базовое понимание того, что нет никакой связи между родительским объектом и object внутри любого из свойств родительского объекта. Это совершенно разные объекты, которые могут находиться где угодно в памяти, имея только ссылку от одного к другому.

Итак, если в свойстве есть хотя бы одна ссылка на object (кроме объекта, которому принадлежит это свойство), но нигде больше нет ссылки на родительский объект, то родительский объект будет помечен для сборки мусора.

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

1. Это не полезный ответ. Это снисходительно и на самом деле не дает правильного ответа на вопрос.

2. @Alastair : (первоначальный вопрос) Сохраняет ли при этом этот десериализованный объект-file-into-a-class-где-нибудь в памяти. Когда Тони Басалло поймет, как работают типы значений и ссылок, тогда он сможет легко ответить на этот вопрос.

3. Конечно, но, очевидно, он не понимает, и вы просто говорите ему, чтобы он понял, не помогает. Ваша правка лучше, но приведите несколько примеров или более подробно, если хотите быть полезными.

4. На самом деле у меня есть базовое понимание этого … Я думаю, что в вопросе упущено то, что вы также пропустили — свойство является ссылочным типом. Это моя забота.