0
votes

"Le processus est terminé par StackoverflowException", la raison de celle-ci dans le code suivant

Une classe qui, en elle-même, contient son propre objet instancié, lors de la création d'un objet de cette classe dans la méthode principale en C #, il donne une stackoverflowextion. Pourquoi?? Je veux la raison de celle-ci, pas la solution.Merci xxx


2 commentaires

Vous instanciez de manière récursive la classe afin que vous manquiez de mémoire de pile. Découvrez cette réponse: Stackoverflow.com/a/34182621/10531996


Le problème est qu'il crée infiniment de plus en plus d'instances


4 Réponses :


1
votes

Votre problème est un Récursion sans fin em> causé par un em> initialisateur de champ em>.

Exemple fort> p> xxx Pré>

A initialisateur de champ em> est exécuté avant les organes de constructeur. Le point de départ important ici est, ils sont toujours forts> exécutés. p>

ce qui signifie que vous ne peut pas strong> faire cela, il fonctionne lorsque la classe classe em> initiale. p> xxx pré> Chaque fois que vous nouveaux em> up (initialisez) cette catégorie em>, il va courir le code ci-dessus, qui, par sa nature, NOUVEAU de nouveaux instances de lui-même en raison de la * Les initialisateurs de champ, que les demi-tour exécuent à nouveau ce qui précède SO-on-ol et donc em> jusqu'à ce que vous manquiez de pile em>. p>

Si vous Voulez-vous vraiment un propriété auto-référençant em> comme celui-ci, et vous le souhaitez initialement initialisé (dans un sens automatique), utilisez une technique de chargement paresseux, par exemple. P>

private Check _checkObject;

public Check CheckObject => _checkObject?? (_checkObject = new Check());


0 commentaires

3
votes

Ceci est dû au fait que lorsque vous créez un nouvel objet de chèque à partir de votre méthode principale, il déclenche l'initialisation de la variable d'instance, checkObject , qui crée à nouveau un objet de chèque de classe. Il s'agit d'une procédure infinie, d'où la mémoire attribuée à votre programme est épuisée.


3 commentaires

@Prakharlondhe il ne peut pas upérer la réponse, mais il peut l'accepter.


@ dan1st ohhkayy, j'ai oublié les privilèges: p


L'acceptation vous apporte plus de réputation quand même :)



2
votes

Vous appelez votre constructeur de classe à chaque fois que la classe est initialisée. La ligne marquée comme ligne 1 est celle que vous ne devriez pas avoir. Cela signifie que vous appelez votre constructeur récursivement.


0 commentaires

2
votes

Si vous essayez de débogage em> Votre programme, vous voyez la sortie similaire à ce qui suit. Si vous ne connaissez presque rien pourquoi cela se produit, au moins vous pouvez deviner que quelque chose est faux sous réserve du constructeur.

Compilation succeeded - 1 warning(s)

jdoodle.cs(5,11): warning CS0414: The private field `check.checkobject' is assigned 
                  but its value is never used


Stack overflow: IP: 0x5647646e1705, fault addr: 0x7fffc422eff8
Stacktrace:
  at <unknown> <0xffffffff>
  at (wrapper alloc) object.AllocSmall (intptr,intptr) <0x00103>
  <...>
  at check..ctor () [0x00000] in <db1fd2bd96e041fab014c4ec28898e03>:0
  at check..ctor () [0x00000] in <db1fd2bd96e041fab014c4ec28898e03>:0
  at check..ctor () [0x00000] in <db1fd2bd96e041fab014c4ec28898e03>:0
  at check..ctor () [0x00000] in <db1fd2bd96e041fab014c4ec28898e03>:0
  at check..ctor () [0x00000] in <db1fd2bd96e041fab014c4ec28898e03>:0
  at check..ctor () [0x00000] in <db1fd2bd96e041fab014c4ec28898e03>:0
  at check..ctor () [0x00000] in <db1fd2bd96e041fab014c4ec28898e03>:0
  at check..ctor () [0x00000] in <db1fd2bd96e041fab014c4ec28898e03>:0
  ........
  ........
  ........
  ........
  ........
  at check..ctor () [0x00000] in <db1fd2bd96e041fab014c4ec28898e03>:0

  output Limit reached.


0 commentaires