2013-06-17 3 views
0

빠른 질문입니다.개체가 범위를 벗어 납니까?

, 내가 실행할 때 이전 Tile의 종결 자 가 Test1를 호출 할 것이다 이제이 코드

public class Tile 
{ 
    public Collision Collision; 
    public Tile() 
    { 
     Collision = new Collision(this); 
    } 
    public ~Tile() 
    { 
     CollisionHandler.Remove(Collision); 
    } 
} 

public class Collision 
{ 
    public Collision() 
    { 
     CollisionHandler.Add(this); 
    } 
} 

public class Main 
{ 
    public Main() 
    { 
     Test1(); 
     Test2(); 
    } 

    public void Test1() 
    { 
     Tile[,] tiles = new Tile[20,20]; 
     tiles[0,0] = new Tile(); 

     tiles[0,0] = new Tile(); 
     //Would calling the above call the old Tile's destructor? 
    } 

    public void Test2() 
    { 
     Tile[,] tiles = new Tile[20,20]; 
     tiles[0,0] = new Tile(); 

     Tile t = new Tile(); 
     tiles[0,0] = t 
     //Would calling the above call the old Tile's destructor? 
    } 
} 

을 고려? Test2은 어떨까요?

+0

FIrstly : C#에서는 '최종 자'라고합니다. 그들은 동일하지 않습니다. 두 번째로, 당신 스스로 이것을 테스트하는 것을 멈추게하는 것은 무엇입니까? –

+0

나는 비행기에서 내 전화기를 타고 있는데, 일부 기능을 대략적으로 작성하기 때문에 알고 싶었다. – redcodefinal

답변

1

C#에서 소멸자 (적절한 이름은 "finalizers"임)는 언제 호출 될지는 결코 모르는 것입니다. 객체가 범위를 벗어나 자마자 호출 될 수 있습니다. 프로그램이 끝나면 호출 할 수 있습니다. 일부 상황에서는 전혀 호출되지 않을 수도 있습니다. 그것은 모두 가비지 컬렉터에 달려있다.

따라서 시스템 논리에 소멸자를 사용하지 마십시오. 소멸자를 사용해야하는 경우는 많지 않습니다.

+0

두 번째로 범위를 벗어나면 수집 된 것이 좋을 것 같습니다. 나는 Collision 밑의 Tile이 꺼내지면 다른 것을 찾아야 할 것입니다. – redcodefinal

+0

IDisposable을 구현하고'using '문에 Tile 클래스를 래핑하십시오. – Fendy

3

대답은 아니오입니다.

오브젝트는 가비지 콜렉터가 원하는 것으로 결정할 때까지 마무리되지 않습니다. C++의 delete과 같이 원격으로 수행하는 것은 없습니다. 새로운 부분의 메모리를 할당하고 포인터를 변경하는 것입니다 (대략적으로).

주석에 설명 된대로 : 종료 자 (C#)와 소멸자 (C++)는 동일하지 않습니다.

+0

답변 해 주셔서 감사합니다. 나는 다른 곳을 봐야 할 것 같네요. – redcodefinal

0

코드가 불완전합니다. 완성 된 경우 참조 객체는 CollisionHandler->Collision->Tile과 같이 연결되므로 무시한 Tile은 가비지 컬렉터에서 수집하지 않습니다.

.NET GC는 비 결정적이므로 자동으로 결정 성있는 소멸자와 같은 것을 찾고 있다면 운이 없다. .NET 프레임 워크는 결정적 정리가 선호되는 상황에 대해 IDispose 인터페이스를 제공합니다. 파일 I/O 작업이지만 소비자는이 사실을 알고 Dispose을 명시 적으로 호출하거나 C#의 using 키워드와 같은 언어 기능을 사용해야합니다.

관련 문제