2012-07-11 3 views
0

Je suis en train de faire des lectures sur les structures et je suis tombé sur un exemple de structures utilisées avec des attributs. Dans l'exemple, l'attribut struct utilisé est [FieldOffset(0)], ce qui signifie que les champs sont stockés dans la même partie de la mémoire.Structures avec FieldOffsetValueAttribute

Quels sont les avantages ou désavantages de cette solution? Aussi pourquoi voudrait-on utiliser FieldOffsetAttribute pour mettre les champs dans différentes parties de la mémoire?

+0

selon http://msdn.microsoft.com/en-us/library/aa288471(v=vs.71).aspx: 'Ce type de contrôle sur la structure est utile lors de l'utilisation de l'invocation de plate-forme. ' –

+1

http : //en.wikipedia.org/wiki/Union_%28computer_science%29 –

+0

@AndreasNiedermair Oui mais pourquoi? – CSharpened

Répondre

2

Ceci est utilisé pour contrôler le décalage exact dans la mémoire des membres de la structure. Il est parfois utilisé en C# lorsque vous voulez représenter une structure native (C++) dans le contexte d'un appel P/Invoke.

En C#, il n'y a pas de choses telles que les unions de structures, donc vous devez utiliser FieldOffsetValueAttribute.

Je vous recommande de lire the following article.

+0

Great link. Merci. – CSharpened

1

Je l'ai vu cette astuce utilisée quelque part, qui va changer le type sous-jacent du tableau, de uint int, sans copier les éléments du tableau:

[StructLayout(LayoutKind.Explicit)] 
struct ArrayTypeChanger 
{ 
    [FieldOffset(0)] 
    public int[] ArrayOfInts; 

    [FieldOffset(0)] 
    public uint[] ArrayOfUInts; 
} 

et quelque part un type- changement de méthode:

public static int[] ChangeArayType(uint[] input) 
{ 
    return new ArrayTypeChanger { ArrayOfUInts = input }.ArrayOfInts; 
} 

Aucune mémoire n'est copiée, ce qui devrait rendre la lecture très rapide. Bien sûr, cela ne fonctionne que si les types ont la même taille (sizeof (uint) == sizeof (int)). Je ne suis pas sûr MS recommande cela ...

D'autres méthodes de modification du type d'un tel tableau (comme Marshal.Copy()) envolve une sorte de copie de la mémoire et cela peut être un problème avec les grandes baies.

Questions connexes