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 ?
Réponses
Trop de publicités?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.
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.
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).
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);
}