Hej! Du behöver inte tänka på det, det sköter CLR:en åt dig. Alla objekt hamnat i en Garbage Collection som rensar upp objekt som inte används etc. Jo det är ju sant att GC går in, men frågan är ju om inte GCn betraktar tillagda eventhandlers som giltiga referenser och därför låter objektet leva i all oändlighet? Du behöver inte skapa en bas klass bara för att använda dispose. gaaaahhhh!!!! Svaret på din fråga är nog "Ja". Kolla [stor tjock delegat bugg i .net?] ursäkta, blandade ihop din första och andra fråga, där jag tolkade din första fråga lite fel.Lifetime management? eller nåt?
Jag har en klass (låt kalla den för myClass) som har en property som spottar ur sig en ny instans av en annan klass (i detta fall en datagridtablestyle). I "get" på propertyn lägger man till en eventhandler (i vb addhandler) för ett event på tablestylen.
Behöver jag bry mig om att ta bort eventhandlern när tablestylen dör? (jag har ingen koll på om eller när detta görs) Kommer objektet att finnas kvar i all evighet om jag inte gör det?Sv: Lifetime management? eller nåt?
Men för att ändå vara på den säkra sidan så skulle jag rekommendera att du alltid rensar upp efter dig. Du kan tex använda dig av IDisposable interfacet.
Mer om detta hittar du på:
http://msdn.microsoft.com/library/en-us/cpgenref/html/cpconfinalizedispose.asp?frame=true
/Fredrik NSv: Lifetime management? eller nåt?
IDispose är ju altid snyggt men då måste jag ju subklassa tablestylen, hålla referens till "aggregeraren", implementera ett event på denne, samt få alla användare till att använda den...Sv: Lifetime management? eller nåt?
Om en lokal "variabel" som är inom ett scope, är den enda existerande referensen till ett objekt, men den lokala variablen kommer aldrig bli utförd från den tillfälliga utförande punkten i proceduren så kommer garbage collector (men är inte tvunget till) behandla objeket som att de inte längre används.
Även om du har en property som spottar ut en instans av ett annat objekt så kommer den med tiden att försvinna. Så du behöver inte tänka på det. CLR:en kommer att sköta rensningen själv. Någon gång i din kod kommer koden att sluta referera till objektet och då kommer den att försvinna.
Tex:
<code>
public void myFunction()
{
MyObject object = new MyObject();
MyStyle style = object.MyStyleProperty;
style.Color = "Black";
}
</code>
När denna funktion når sitt slut som kommer object och style att hamna i garabe collection och efter ett tag raderas.
Skulle du returnera object eller style vid funktionen så kommer den koden i sig nå sitt slut och då försvinner referencen till ditt objekt där och då tas i hand om garbage collection.
tex:
<code>
public MyStyle myFunction()
{
MyObject object = new MyObject();
MyStyle style = object.MyStyleProperty;
style.Color = "Black";
return style;
}
public void myMainFunc()
{
MyStyle style = myFunction();
string color = style.Color;
}
</code>
När myMainFunc når sitt slut så försvinner referencen till style, och kommer med tiden att försvinna genom att garbage collection tar hand om den. Men att vara på den säkra sidan och så är det bäst att göra rensingen själv så jag brukar ha som regel att alltid sätta min object till null (Nothing i VB.Net) när jag ska sluta använda dom, eller implementerar IDisposing om anropa Dispose (Ofta har man dispose för att rensa bort unmanage objekt eller tex vara säker på att en fil är stängd eller connection etc).
/Fredrik NSv: Lifetime management? eller nåt?
Var vänlig och läs min andra inlägg en gång till.
Jag har full förståelse för gammal hedlig GC samt Dispose användandet.
Någon basklass har jag aldrig sagt att jag behöver skapa.
Så frågan en gång till:
Räknas tillagda eventhandlers som giltiga referenser ur GCns synvinkel? (ja/nej/vet inte)Sv: Lifetime management? eller nåt?
Så länge som din instans av MyClass har andra referenser, lever nog din Tablestyle. Som jag tolkar klarar GC:n cirkulära referenser dvs om MyClass bara har referens till TableStyle och ingen annan refererar till Myclass eller TableStyle kommer både TableStyle och MyClass att GC:as. OBS detta är ingenting som jag vet något om utan bara vad jag tolkar ur andras inlägg.Sv: Lifetime management? eller nåt?
Som du säkert vet så är events baserat på delegates modellen.
Så:
När en delegate refererar till en instans metod, så sprarar delegaten en referens till metodens entry point och en referens till ett objekt. Detta objekt får inte vara null.
Om en delegate refererar till en statisk metod, så sparar delegaten en reference till medotden entry point. Det objekt som som har den statiska metoden är en null referens.
Med detta vill jag komma med att en referens till statisk metod kommer at GC att tolkas som ingen refernece efter som det inte finns något initierat objekt (mål objektet är en null reference). Alltså när objektet som har eventet inte används så kommer garbage collection att ta hand om det.
Har du en reference till en initierad klass, så kommer det finnas en reference till ett objekt, men eftersom detta referenade objekt kommer att bli null efter en tid så kommer GC att ta hand om det.
exempel:
<code>
function void myTest()
{
myClass myC = new myClass();
myDelegate myD1 = new myDelegate( myC.myMethod );
myDelegate myD2 = new myDelegate( myClass.myStaticMethod );
//Här kommer myC att bli null och det innebär att delegaten inte har något
//objekt att referera till.
//myD2 har inte refernece till ett initierat objekt och kommer därför att tolkas
//som att ingen refernece finns av GC.
}
</code>
Alltså kommer din klass att hamna i GC, inte leva i all evighet.
Hoppas detta var ett bättre svar på din fråga.
/Fredrik N