그래서이 프로젝트는 클래스의 여러 인스턴스를 생성하고 나열합니다.클래스의 인스턴스를 삭제하는 방법은 무엇입니까?
어느 시점에서 인스턴스화 된 클래스는 더 이상 필요하지 않습니다. 나는 어떻게 그것을 내뿜을 수 있는가?
지금까지 클래스가 더 이상 할 일이없는 경우에도 (하나의 정적 클래스 인 경우 프로그램이 종료되었을 때조차도) 내 목록에 있고 공용 변수 여전히 사용할 수 있습니다 ...
그래서이 프로젝트는 클래스의 여러 인스턴스를 생성하고 나열합니다.클래스의 인스턴스를 삭제하는 방법은 무엇입니까?
어느 시점에서 인스턴스화 된 클래스는 더 이상 필요하지 않습니다. 나는 어떻게 그것을 내뿜을 수 있는가?
지금까지 클래스가 더 이상 할 일이없는 경우에도 (하나의 정적 클래스 인 경우 프로그램이 종료되었을 때조차도) 내 목록에 있고 공용 변수 여전히 사용할 수 있습니다 ...
인스턴스에서 이벤트를 발생시킬 수 있습니다 (OnInactivated, say). 목록 클래스는 항목이 목록에 추가되거나 (목록을 하위 클래스로 만들거나 목록을 캡슐화하고 Add 메서드를 재정의 할 때) 이러한 이벤트에 대한 처리기를 추가해야합니다. 이벤트가 발생하면 개체가 목록에서 제거됩니다. 객체가 다른리스 트에서 참조되지 않는다고 가정하면 (듣기도 함) 가비지 수집기는 객체를 처리 할 수 있습니다.
이런 식으로 개체는 참조 자체를 모두 추적 할 필요가 없으며 참조 홀더에게 참조를 해제하는 방법을 알 수 있습니다. 희망 발생해야하는지 설명하기 http://www.coderun.com/ide/?w=Hw83i0wAQkugUif5Oj2lmw
왜 플러시 걱정? 왜 그냥 .Net Garbage Collection하게하지 않습니까?
Altenatively 당신이
MyClass.Dispose();
UPDATE를 IDisposable를 구현하고 호출 할 수 있습니다 : 당신은 사용자 지정 컬렉션뿐만 아니라 활성 클래스를 반환하는 목록을 원하는 것 같은데. ICollection을 구현하는 MyClassCollection이라는 새 클래스를 만들고 활성 클래스 만 반환하는지 확인하십시오.
활성 목록 만 최신 상태로 유지하고 비활성 상태는 무시하십시오. – Ben
@Ben "활성 수업"이란 무엇을 의미합니까? – Pwninstein
이 질문에 대한 대답은 어떤 종류의 목록에 해당 인스턴스가 있음을 의미합니다. 더 이상 원하지 않는 인스턴스를 목록에서 제거하고 다른 참조가 없는지 확인하십시오. 어떤 시점에서 가비지 수집기가 다시 회수합니다.
예 :
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);
}
}
자신의 가비지 컬렉션을 방지하지 않고 객체를 참조에 대한 일반적인 솔루션은 WeakReference를 사용하는 것입니다
다음은 실행 가능한 예입니다.
무엇? 범위를 벗어나면 '사용할 수 없음'이됩니다. 그 범위는 무엇입니까? 공전? 그렇다면 범위를 벗어나지 않을 것입니다 ... –
관리되지 않는 리소스를 할당하지 않는다고 가정 할 때 가비지 수집기는 필요한 경우 언제든지 처리해야하지만 해당 메모리를 회수합니다. 컬렉션을 강제로). – Pwninstein
가비지 수집을 이해하지 못하는 것 같습니다. .NET이 이미 수행하고있는 작업을 수행하기 전에 바로 그 작업을 수행해야합니다. –