In alcune revisioni del codice di eredità codice C# che ho fatto di recente ho visto un certo numero di esempi come questo:La pratica del passaggio dell'oggetto padre come riferimento per l'interazione oggetto padre Evil?
class ManagerParentClass
{
public string CustomProperty{get;set;}
public void Log(string message);
void DoABunchOfTasks()
{
new SomethingService().DoSomething(this);
}
}
con il seguente:
public class SomethingService
{
ManagerParentClass _manager;
void DoSomething(ManagerParentClass manager)
{
_manager = manager;
// do something
_manager.CustomProperty = "hello world";
_manager.Log("said hello world");
}
}
Anche se questo funziona bene su In superficie, sono preoccupato che questo sia un po 'un anti-pattern che potrebbe causare cose malvagie con la garbage collection.
Questo interromperà il garbage collector generazionale nella capacità di .Net di pulire correttamente gli oggetti padre e figlio o qualsiasi altra cosa negativa?
Il GC non manterrà una radice se non sono in uso. Questa è solo una cattiva programmazione, penso. Le classi hanno mescolato le responsabilità. Domanda fantastica però. –
I riferimenti padre-figlio sono comuni in qualsiasi grafico di oggetto coinvolto in modo decente. Questa è la benedizione di .NET GC.Prima dovevamo usare 'CopyMemory' e' ObjPtr' per rompere i riferimenti circolari nell'imperdente sistema di gestione della memoria in VB6. – tcarvin