Référence circulaire en c#

badr00075 Messages postés 34 Statut Membre -  
 badr00075 -
salut tout le monde

après l'exécution de mon code une référence circulaire me génère un stack overflow :


/**************** class A *******************/
public class ClasseA
{

ClasseB objB = new ClasseB();

int[] table = new int[50000];

public ClasseA()
{
TestRefCirculaire.compteur++;

ClasseB objB = new ClasseB();



}
}



/***************** class B ***********************/

public class ClasseB
{
ClasseA objA = new ClasseA();

int[] table = new int[50000];

public ClasseB()
{

TestRefCirculaire.compteur++;
ClasseA objA = new ClasseA();
}


}


/********************* TestRefCirculaire ************/

public class TestRefCirculaire
{
public static int compteur;
public TestRefCirculaire()
{
compteur = 0;
}

public static void Main(String[] args)

{

ClasseA test = new ClasseA();
}

}


tout à fais normal : c'est qui le premier ? la poule ou l'oeuf ?

est ce que quelqu'un a une idée comment on peut résoudre la référence circulaire en c# SVP ?!!!

merci d'avance et a++

7 réponses

Antisuperman
 
concevoir les chose autrement est une bonne solution, s'il y une référence circulaire, c'est sans doute qu'il y a un problème de conception.
0
badr00075 Messages postés 34 Statut Membre 12
 
merci tout d'abord pour ta réponse Antisuperman !!


donc qu'est ce que tu propose comme solution ? comment pourrai je concevoir la solution à ce problème ?
0
Antisuperman
 
Bien là comme ça c'est difficile à dire. Tout dépends du projet.
La question est comment en es tu venu à créer une telle référence, quel est le besoin ?
Si tu peux donner plus de précision sur les besoins, et ce qui t'as amener à faire cette architecture, peut être qu'on pourra t'aider.
0
badr00075
 
hi

effectivement mon problème ou mon projet est de proposer une solution à une référence circulaire , ce n'est pas une partie d'un projet mais c'est un cas qui peut se présenter dans la conception d'un programme

so , is there any solution ????

dsl pour ce retard
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Antisuperman
 
D'accord... Essayes alors de faire du "Lasyloading", tu charges la référence uniquement lorsqu'elle est appelée.

exemples

public class ClassA
{
 private ClassB classB = null;
 public ClassB ClassB
 {
  get{ return classB == null ? new ClassB() : classB;}
  set { classB = value;}
 }
}

public class ClassB
{
 private ClassA classA = null;
 public ClassA ClassA 
 {
  get{ return classA == null ? new ClassA () : classA ;}
  set { classA = value;}
 }
}




Je ne sais pas si tu as bien compris, mais c'est un truc dans le genre.
Comme ça lorsque tu fais un new ClassA(), tu n'as pas de stackoverflow, et tu as une référence à ClassB qui s'initialisera seulement lorsque tu fera appelle à classA.ClassB.


Bref, j'espère que ça t'aurai aidé, mais en générale, vaut mieux éviter ce genre de situation.

Bonne journée.
0
badr00075
 
merci pour ta réponse .

je vais analyser le code et je te réponds , a++
0
badr00075
 
Hi antisuperman


j'ai utilisé un compteur pour arrêter l'instanciation et annuler +/- les références du diagramme de classe .
voici la solution que j'ai réalisé :


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace projet_csharp_2010
{


/**************** class A *******************/
public class ClasseA
{



int[] table = new int[50000];

public ClasseA()
{
TestRefCirculaire.compteur++;
Console.WriteLine("le compteur est à "+TestRefCirculaire.compteur);

if (TestRefCirculaire.compteur > TestRefCirculaire.a)
{
Console.WriteLine("A n'as pas été créer");
Console.WriteLine("fin du programme");
Environment.Exit(0);
}
Console.WriteLine("A a été créer ");

ClasseB objB = new ClasseB();



}
}



/***************** class B ***********************/

public class ClasseB
{


int[] table = new int[50000];

public ClasseB()
{

TestRefCirculaire.compteur++;
Console.WriteLine("le compteur est à "+TestRefCirculaire.compteur);


Console.WriteLine("B a été créer ");
ClasseA objA = new ClasseA();
}


}


/********************* TestRefCirculaire ************/

public class TestRefCirculaire
{
public static int compteur;
public static string rep;
public static int a;

public TestRefCirculaire()
{
compteur = 0;


}

public static void Main(String[] args)
{
Console.WriteLine("Entrez le nombre des instances SVP ?");
rep = Console.ReadLine();
int.TryParse(rep, out a);
a *= 2;

ClasseA test = new ClasseA();
}

}
}
0