Vorgehensweise: Erstellen einer Union in C/C++ mit Attributen (C#)How to: Create a C/C++ Union by Using Attributes (C#)

Mithilfe von Attributen können Sie anpassen, wie Strukturen im Arbeitsspeicher angeordnet werden.By using attributes you can customize how structs are laid out in memory. Sie können z.B. das erstellen, was als eine Union in C/C++ bekannt ist, indem Sie die mit StructLayout(LayoutKind.Explicit)- und FieldOffset-Attribute verwenden.For example, you can create what is known as a union in C/C++ by using the StructLayout(LayoutKind.Explicit) and FieldOffset attributes.

BeispielExample

In diesem Codesegment beginnen alle Felder von TestUnion an derselben Position im Arbeitsspeicher.In this code segment, all of the fields of TestUnion start at the same location in memory.

// Add a using directive for System.Runtime.InteropServices.  

       [System.Runtime.InteropServices.StructLayout(LayoutKind.Explicit)]  
       struct TestUnion  
       {  
           [System.Runtime.InteropServices.FieldOffset(0)]  
           public int i;  

           [System.Runtime.InteropServices.FieldOffset(0)]  
           public double d;  

           [System.Runtime.InteropServices.FieldOffset(0)]  
           public char c;  

           [System.Runtime.InteropServices.FieldOffset(0)]  
           public byte b;  
       }  

BeispielExample

Im Folgenden finden Sie ein weiteres Beispiel, in dem Felder an verschiedenen, explizit festgelegten Orten beginnen.The following is another example where fields start at different explicitly set locations.

// Add a using directive for System.Runtime.InteropServices.  

       [System.Runtime.InteropServices.StructLayout(LayoutKind.Explicit)]  
       struct TestExplicit  
       {  
           [System.Runtime.InteropServices.FieldOffset(0)]  
           public long lg;  

           [System.Runtime.InteropServices.FieldOffset(0)]  
           public int i1;  

           [System.Runtime.InteropServices.FieldOffset(4)]  
           public int i2;  

           [System.Runtime.InteropServices.FieldOffset(8)]  
           public double d;  

           [System.Runtime.InteropServices.FieldOffset(12)]  
           public char c;  

           [System.Runtime.InteropServices.FieldOffset(14)]  
           public byte b;  
       }  

Die zwei Ganzzahlfelder i1 und i2 teilen die gleichen Speicheradressen wie lg.The two integer fields, i1 and i2, share the same memory locations as lg. Diese Art der Kontrolle über das Strukturlayout ist nützlich, wenn Sie Plattformaufrufe nutzen.This sort of control over struct layout is useful when using platform invocation.

Siehe auchSee Also

System.Reflection
Attribute
C#-ProgrammierhandbuchC# Programming Guide
AttributeAttributes
Reflektion (C#)Reflection (C#)
Attribute (C#)Attributes (C#)
Erstellen benutzerdefinierter Attribute (C#)Creating Custom Attributes (C#)
Accessing Attributes by Using Reflection (C#) (Zugriff auf Attribute mit Reflektion (C#))Accessing Attributes by Using Reflection (C#)