2010-06-20 7 views
3

그래서이 프로젝트는 클래스의 여러 인스턴스를 생성하고 나열합니다.클래스의 인스턴스를 삭제하는 방법은 무엇입니까?

어느 시점에서 인스턴스화 된 클래스는 더 이상 필요하지 않습니다. 나는 어떻게 그것을 내뿜을 수 있는가?

지금까지 클래스가 더 이상 할 일이없는 경우에도 (하나의 정적 클래스 인 경우 프로그램이 종료되었을 때조차도) 내 목록에 있고 공용 변수 여전히 사용할 수 있습니다 ...

+0

무엇? 범위를 벗어나면 '사용할 수 없음'이됩니다. 그 범위는 무엇입니까? 공전? 그렇다면 범위를 벗어나지 않을 것입니다 ... –

+1

관리되지 않는 리소스를 할당하지 않는다고 가정 할 때 가비지 수집기는 필요한 경우 언제든지 처리해야하지만 해당 메모리를 회수합니다. 컬렉션을 강제로). – Pwninstein

+2

가비지 수집을 이해하지 못하는 것 같습니다. .NET이 이미 수행하고있는 작업을 수행하기 전에 바로 그 작업을 수행해야합니다. –

답변

3

인스턴스에서 이벤트를 발생시킬 수 있습니다 (OnInactivated, say). 목록 클래스는 항목이 목록에 추가되거나 (목록을 하위 클래스로 만들거나 목록을 캡슐화하고 Add 메서드를 재정의 할 때) 이러한 이벤트에 대한 처리기를 추가해야합니다. 이벤트가 발생하면 개체가 목록에서 제거됩니다. 객체가 다른리스 트에서 참조되지 않는다고 가정하면 (듣기도 함) 가비지 수집기는 객체를 처리 할 수 ​​있습니다.

이런 식으로 개체는 참조 자체를 모두 추적 할 필요가 없으며 참조 홀더에게 참조를 해제하는 방법을 알 수 있습니다. 희망 발생해야하는지 설명하기 http://www.coderun.com/ide/?w=Hw83i0wAQkugUif5Oj2lmw

+0

+1 나는 @ Brian의 답변에 이와 비슷한 메시지를 게시했습니다. – slugster

+0

고마워, 그 말이 맞는, 나는 그것을 구현하려고합니다. – Ben

+1

@Ben - 실행 가능한 예제 링크를 추가했습니다. –

4

왜 플러시 걱정? 왜 그냥 .Net Garbage Collection하게하지 않습니까?

Altenatively 당신이

MyClass.Dispose(); 

UPDATE를 IDisposable를 구현하고 호출 할 수 있습니다 : 당신은 사용자 지정 컬렉션뿐만 아니라 활성 클래스를 반환하는 목록을 원하는 것 같은데. ICollection을 구현하는 MyClassCollection이라는 새 클래스를 만들고 활성 클래스 만 반환하는지 확인하십시오.

+0

활성 목록 만 최신 상태로 유지하고 비활성 상태는 무시하십시오. – Ben

+0

@Ben "활성 수업"이란 무엇을 의미합니까? – Pwninstein

4

이 질문에 대한 대답은 어떤 종류의 목록에 해당 인스턴스가 있음을 의미합니다. 더 이상 원하지 않는 인스턴스를 목록에서 제거하고 다른 참조가 없는지 확인하십시오. 어떤 시점에서 가비지 수집기가 다시 회수합니다.

+0

그래서 비활성 상태가되는 클래스는 어떻게 든 목록을 보유하고있는 클래스에게 그 클래스를 제거하라는 통지를해야합니다. 그래서 가비지 컬렉터가 처분 할 수 있습니다 ... 잘못된 ... 맞습니까? :) – Ben

+0

이것이 귀하의 신청서 구성 방법이라면 그렇습니다. –

+1

@Ben, 정보를 입력하지 않았을 수 있습니까? 이 수업이 언제 비활성화되는지 어떻게 알 수 있습니까?그 물체가 "이봐, 더 이상 할 일이 없어, 나는 더 이상 활동하지 않는다"라고 말하는 행사를 일으켜야할까요? – slugster

2

예 :

public class MyClass { 
    public string MyString { get; private set; } 
    public int MyInt { get; private set; } 
    public double MyDouble { get; private set; } 

    public MyClass(string myString, int myInt, double myDouble){ 
     MyString = myString; 
     MyInt = myInt; 
     MyDouble = myDouble; 
    } 
} 

public class SomeOtherClass{ 
    public List<MyClass> m_Instances = new List<MyClass>(); 

    public void FillList(){ 
     //Instantiate 3 items, and add to the list 
     m_Instances.Add(new MyClass("1", 2, 3d)); 
     m_Instances.Add(new MyClass("4", 5, 6d)); 
     m_Instances.Add(new MyClass("7", 8, 9d)); 
    } 

    public void RemoveFirst(){ 
     //Remove the first one. As long as the removed item has no 
     //other instances, the Garbage Collector will (in its own time) 
     //destroy that unused object, and reclaim the memory. 
     m_Instances.RemoveAt(0); 
    } 
} 
0

자신의 가비지 컬렉션을 방지하지 않고 객체를 참조에 대한 일반적인 솔루션은 WeakReference를 사용하는 것입니다

다음은 실행 가능한 예입니다.

관련 문제