2017-01-05 2 views
0

В C# это эффективное программирование?Виртуальные ICollection

Мне было интересно, так как t1 ссылки на t2 и t2 ссылки на t1 и, следовательно, он также ссылается на себя, будет ли он занимать больше места или, как это опасный алгоритм/код?

static void Main(string[] args) 
{ 
    Test t1 = new Test(1); 
    Test t2 = new Test(2); 
    Test t3 = new Test(3); 
    Test t4 = new Test(4); 
    t1.Links = new List<Test>(); 
    t1.Links.Add(t2); 
    t2.Links = new List<Test>(); 
    t2.Links.Add(t1); 

    Console.WriteLine(t1.Links.First().Links.First().id); 
    Console.Read(); 
    return; 
} 

public class Test 
{ 
    public int id { get; set; } 

    public virtual ICollection<Test> Links { get; set; } 

    public Test(int Id) 
    { 
     id = Id; 
    } 
} 

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

+0

Возможный дубликат [сборщика мусора и круговой ссылки] (http://stackoverflow.com/questions/8840567/garbage-collector-and-circular-reference) –

+2

Что вы пытаетесь архивировать с этим объектом дерева? Если для вашей проблемы требуется структура данных с циклическими ссылками, вполне нормально создавать такую ​​структуру данных ... в ней нет ничего опасного;) – JanDotNet

+0

Как @JanDotNet просто сказал, в этом нет ничего плохого. Возможно, вы могли бы защитить время/пространство, создав лучшую структуру. Вы могли бы определенно сохранить один Список здесь ... но это действительно зависит от того, что вы хотите Архивировать. – Cataklysim

ответ

1

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

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

1

Если вам нужны круговые ссылки, просто используйте их логически, с ними нет ничего плохого (например, узлы дерева с дочерними и родительскими причинами также CR).

В некоторых случаях CRs может быть боль, но ничего серьезного:

  • Сериализация: По умолчанию двоичная сериализация обрабатывает их правильно, но может привести к сериализовать весь граф независимо от узла вы действительно хотите сериализовать. Возможно, вы захотите использовать некоторые настройки, чтобы избежать таких проблем. Аналогичные соображения могут быть учтены также в XML, json и других типах сериализации.
  • Сбор мусора: График объекта не будет выпущен до тех пор, пока, по крайней мере, ни один узел не будет указан где-то. Если вы хотите выпустить объекты по одному, убедитесь, что вы удалили их правильно при удалении или сделали их одноразовыми, что удаляет каждую ссылку на расположенный объект.
Смежные вопросы