Dado que tiene la siguiente clase (malo C#, pero usted consigue la deriva):¿Cuál sería un buen algoritmo para una verificación circular de referencia en este caso?
public abstract class AmICircular
{
// assume Children is never null
private List<AmICircular> Children {get;set;}
// assume target is never null
public void Add(AmICircular target)
{
target.PerformCircularReferenceCheck(this);
Children.Add(target);
}
// throws when a circular reference is detected
protected abstract void PerformCircularReferenceCheck(AmICircular target);
}
¿Cómo poner en práctica PerformCircularReferenceCheck? Y, no, esto no es tarea.
La aplicación ingenua, imo, sería hacer una verificación de referencia sobre this
y todos los niños, a continuación, llamar PerformCircularReferenceCheck en target
, pasando this
. Pero me pregunto si hay formas mejores y comprobadas para hacerlo, como agregar un método para contraer todo el árbol de referencias de Children para this
y target
y luego examinar los resultados (¿hay menos presión en la pila?), O quizás evite el cheque por completo mediante el uso de una colección diferente (¡tal vez autocomprobación!) que no sea la Lista < T>?
¿Cómo harías esto?
edit: Como Stefan señaló, sólo es necesario para determinar si este es alcanzable por el objetivo
Si no es tarea, entonces dejo que el serializador JSON lo haga por mí. JsonConvert.SerializeObject (myObject) generará un error de referencia circular si existe. –