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
4 Réponses :
Votre problème est un Récursion sans fin em> causé par un em> initialisateur de champ em>. Exemple fort> p> A initialisateur de champ em> est exécuté avant les organes de constructeur. Le point de départ important ici est, ils sont ce qui signifie que vous ne peut pas strong> faire cela, il fonctionne lorsque la classe classe em> initiale. 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());
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 code>, 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. P>
@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 :)
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. P>
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.
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