J'ai besoin d'encapsuler un tableau fixe d'un type de valeur défini par l'utilisateur (appelons-le struct2) à l'intérieur d'une autre structure (struct1), mais les tableaux fixes ne peuvent être déclarés que pour les types de valeur natifs. J'ai donc pensé à créer une troisième structure (struct wrapper) qui doit fonctionner comme un tableau de la struct2 en définissant l'opérateur []. Donc
struct Struct2
{
int a;
int b
}
struct wrapper
{
Struct2 str0;
Struct2 str1;
public Struct2 this[int index]
{
get
{
switch ( index )
{
case 0: return str0;
case 1: return str1;
default: return str0;
}
}
}
}
static void Main()
{
wrapper wr = new wrapper();
wr[0].a = 123; // i would like to do this but this doesnt work
//but if we do like this
Struct2 [] arr = new Struct2[5];
arr[0].a = 123 ;// this works , we are effectively modifying the object
//contained in the array (not just a copy)
}
Ok, ce code ne fonctionne pas parce que Struct2 est un type de valeur et quand l'opérateur retourne, il retourne une copie et non l'objet réel str0 qu'il contient. J'aimerais accéder à ce champ en utilisant un indexeur ! est-ce possible ? Pourquoi est-ce possible avec la classe Array ? Je sais que c'est possible en retournant un pointeur mais cela implique d'utiliser le mot clé fixed à l'intérieur de la définition de l'opérateur et j'aimerais éviter cela parce que le 'tableau' doit être accédé de manière extensive et je finirais par utiliser l'instruction fixed 2 fois (à l'intérieur et à l'extérieur pour garder l'adresse fixe). De plus, j'ai déjà envisagé d'utiliser des pointeurs en déclarant simplement N champs Struct2 adjacents dans Struct1 et en utilisant un pointeur sur le premier comme un tableau, mais je préférerais utiliser le wrapper pour émuler le comportement d'un tableau. Encore une fois, est-ce possible ?
Editer Il semble qu'il ne soit pas possible d'implémenter un tableau personnalisé qui fonctionne avec les types de valeurs (comme le font les tableaux ordinaires). La solution la plus proche que j'ai pu trouver est celle-ci, mais comme je l'ai écrit, j'aurais aimé éviter les pointeurs.
struct Struct2
{
int a;
int b
}
struct Struct1
{
public Struct2 * str2arr ; //this can be avoided
public Struct2 str0;
//wrapper is not needed anymore as Struct1 is wrapping the Struct2 array by itself
//and a pointer is used for indexing operations
//struct layout needs to be sequential
private Struct2 str1;
private Struct2 str2;
private Struct2 str3;
private Struct2 str4;
}
static void Main()
{
Struct1 myStruct = new Struct1();
fixed(myStruct.str2arr = &myStruct.str0)
{
myStruct.str2arr[1] = 123;
}
}