2017-01-05 1 views
0

있음 C# 있음이 효율적인 프로그래밍 무엇입니까?가상 ICollection

t1에 연결된 t1과 t2에 대한 t2 링크가 궁금 해서요. 따라서 그것은 또한 자신의 사이트로 연결되어 더 많은 공간을 차지하게 만들거나 위험한 알고리즘/코드입니까?

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가 주 객체와 함께 DB에서 이러한 가상 객체를로드한다는 것을 알아 차렸다. 그래서 문제가 될지 궁금해했다.

+0

가능한 복제 (http://stackoverflow.com/questions/8840567/garbage-collector-and-circular-reference) 해당 오브젝트 트리에 보관하려고하는 어떤 –

+2

? 문제가 순환 참조가있는 데이터 구조를 필요로하는 경우 그러한 데이터 구조를 만드는 것이 좋습니다 ... 위험하지는 않습니다.) – JanDotNet

+0

@JanDotNet처럼 방금 말했듯이 아무 것도 없습니다. 더 나은 구조를 만들면 안전 시간/공간을 확보 할 수 있습니다. 당신은 확실하게 목록 하나를 여기에서 목록으로 만들 수 있었다 ... 그러나 당신이 보관하고 싶은 무슨을에 진짜로 달려있다. – Cataklysim

답변

1

인스턴스 간의 순환 참조의 주요 문제점은 구조에 대한 추론이 더 어렵다는 것이다 프로그램이 실행되는 동안 데이터의 이로 인해 가능한 순환 참조를 예측하고 감지해야하기 때문에 많은 코드가 더 복잡해집니다.

본질적으로 코드에 문제가있는 것은 아니지만 처음으로 순환 참조가 필요한지 먼저 생각해야합니다. 데이터를 표현하는 다른 방법이있을 수 있습니다.

1

순환 참조가 논리적으로 사용되어야하는 경우에는 아무런 문제가 없습니다 (예 : Children 및 Parent가있는 트리 노드는 CR을 유발 함).

  • 직렬화 :

    은 어떤 경우에는 CR을 심각한 고통하지만 아무것도 할 수있는 기본 바이너리 직렬화가 올바르게 처리하지만, 상관없이 당신이 정말로 직렬화 할 노드의 전체 그래프를 직렬화하는 원인이 될 수 있습니다. 이러한 문제를 피하려면 사용자 정의를 사용하는 것이 좋습니다. XML, json 및 다른 종류의 직렬화에서도 비슷한 고려 사항을 고려할 수 있습니다.

  • 가비지 수집 : 적어도 하나의 노드가 어딘가에서 참조 될 때까지 객체 그래프가 해제되지 않습니다. 객체를 하나씩 해제하려면 제거시 해당 객체의 연결을 정확하게 끊거나 폐기 가능하게 만들어 폐기 된 객체에 대한 모든 참조를 제거하십시오.
[가비지 컬렉터와 순환 참조]의