Est-ce que la déclaration en c # alloue de la mémoire ou est-ce le nouvel opérateur qui alloue de la mémoire?

Est-ce que la déclaration en c # alloue de la mémoire à la variable à créer ou est-ce l’opérateur new qui alloue de la mémoire et permet d’appeler le constructeur pour initialiser la variable allouée en mémoire?

À ma connaissance, vous ne pouvez appeler un constructeur d’aucun type sans l’opérateur new. Ai-je raison?

Est-ce que la déclaration en c # alloue de la mémoire à la variable à créer ou est-ce l’opérateur new qui alloue de la mémoire et permet d’invoquer l’instructeur pour initialiser la variable allouée en mémoire?

Premièrement, assurons-nous que vous posez la question que vous pensez poser. Pour un type de valeur, l’emplacement de stockage de la variable et l’emplacement de stockage de la valeur sont identiques . Pour un type de référence, l’emplacement de stockage associé à la variable contient une référence à l’emplacement de stockage associé à l’object . Ce sont complètement différents.

Deuxièmement, clarifions ce que vous entendez par “déclaration” d’une “variable”. Un champ statique, un champ d’instance, une variable locale et un paramètre formel ont tous des déclarations. De plus, la sémantique d’allocation des variables locales et des parameters formels est différente s’il s’agit de locales externes fermées d’un lambda, et la sémantique est également différente lorsque la locale est dans une méthode async ou un bloc iterator.

Supposons donc que vous avez une variable locale de type référence et que la variable locale n’a rien d’extraordinaire:

void M() { Animal x = new Giraffe(); ... 

L’emplacement de stockage de la variable locale x est affecté à partir de la mémoire à court terme – la stack ou un registre, généralement – lorsque la méthode M () est activée.

Lorsque la “nouvelle Giraffe ()” est évaluée, le moteur d’exécution alloue de la mémoire pour une Girafe dans le stockage à long terme – le segment GC -, puis transmet une référence à cet object au constructeur. Lorsque le constructeur revient, la référence est ensuite affectée au local.

Donc, il y a deux emplacements de stockage. Il y a l’emplacement à court terme pour x, qui ne vit que tant que l’activation de la méthode, et il y a le stockage à long terme pour l’élément dont il est question, et qui rest en vie jusqu’à ce que le ramasse-miettes le nettoie.

Si cela ne répond pas à votre question, clarifiez votre question.

Pouvez-vous appeler un constructeur sans le nouvel opérateur?

Je suppose que par “constructeur”, vous entendez un constructeur d’instance et non un constructeur statique.

Pas par aucun moyen “normal”, non.

déclaration sans spécification alloue de la mémoire pour (object) null en C # …

 ssortingng x; // x = null in memory ssortingng x = ""; // x = ssortingng in memory with value. MyObjectType x; // x = null; MyObjectType x = new MyObjectType(); // x = MyObjectType in memory. 

Les types Déclaration de référence n’occupent qu’un espace pour la référence, jusqu’à ce que vous créiez un object avec un nouveau mot clé. Idem pour les types de valeur

alors si vous avez:

 ssortingng s; // only reference type memory, which is based on the machine architecture. 

si vous avez:

 ssortingng s = "some ssortingng"; // reference (pointer) + memory allocated on the heap. 

C’est presque la même chose pour les types de valeur, cependant, leur mémoire est allouée en ligne où le type de valeur est déclaré.

Et vous avez raison, vous ne pouvez pas appeler le constructeur de tout type sauf si un object du type est instancié / créé.