2 votes

La structure a-t-elle un constructeur par défaut ?

J'ai lu quelque part que l'utilisation de new pour instancier un struct attribue des valeurs par défaut à toutes les variables de l'instance. Cela implique-t-il que les valeurs d'une structure seront initialisées par un constructeur caché par défaut ?

2voto

Henk Holterman Points 153608

Cela implique-t-il que les valeurs d'une structure seront initialisées par un constructeur caché par défaut ?

Oui, dans le sens où tous les champs des membres seront mis à leur valeur de default(T) valeurs.

En pratique, le compilateur pourrait simplement faire quelque chose comme memset(ptr, 0, sizeInBytes) . Ce qui se passe réellement est un détail de mise en œuvre.

0voto

HMZ Points 1906

Une structure ne peut pas avoir de constructeur sans paramètre et pour initialiser vos valeurs vous devez écrire un constructeur avec des paramètres et l'appeler explicitement lors de l'initialisation de l'objet et vous devez initialiser tous les champs, et par défaut si vous n'avez pas spécifié de constructeur toutes les valeurs seront initialisées à leurs valeurs par défaut comme vous l'avez dit avec un constructeur invisible. Remarque : le CLR permet aux structures d'avoir un constructeur sans paramètre dans le langage IL, par exemple.

0voto

supercat Points 25534

Chaque type d'emplacement de stockage dans .NET qui occupe N octets a une valeur par défaut, dont la représentation est une séquence de N octets initialisés à zéro. La valeur par défaut d'un type de référence quelconque se comportera comme une référence nulle, la valeur par défaut d'un type numérique se comportera comme le nombre zéro et la valeur par défaut d'un type de structure se comportera comme une instance dont tous les membres ont des types par défaut. L'emplacement de stockage est initialisé à la valeur par défaut lorsque l'objet qui contient il est créé ; le seul aspect du type de l'emplacement de stockage qui est pertinent pour le processus est sa taille. Si un type de structure Foo a une longueur de 16 octets et une classe possède un champ de type Foo La création d'une instance de cette classe réservera 16 octets pour la structure et les initialisera à zéro, sans appeler aucun type de constructeur pour cette structure.

Notez que si une structure a un constructeur sans paramètre, il y a certaines circonstances dans lesquelles la création d'une instance invoquera ce constructeur, mais beaucoup dans lesquelles la création d'un emplacement de stockage créera effectivement une instance sans appeler le constructeur. Comme il n'est pas toujours évident de savoir quel traitement serait applicable dans quelle situation, certains concepteurs de langages ont décidé d'esquiver le problème en interdisant simplement la définition de constructeurs sans paramètre et en supposant qu'aucune structure n'en aura (en ignorant la possibilité de constructeurs sans paramètre déclarés dans d'autres langages).

0voto

Mish Points 1

Ma solution pour utiliser des structures avec un constructeur sans paramètre

struct MyStruc
{
    // MyStruc( int NoOp = 0 ) did not work. The code was not called until a parameter was passed in. 
    public MyStruc( int NoOp )
    {
       MyFooBar = new FooBar()
    }

    public FooBar MyFooBar;
}

public class Main
{
    // Implementation
    public MyStruc ms = new MyStruct(0);
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X