LayoutKind Enum
Definitie
Belangrijk
Bepaalde informatie heeft betrekking op een voorlopige productversie die aanzienlijk kan worden gewijzigd voordat deze wordt uitgebracht. Microsoft biedt geen enkele expliciete of impliciete garanties met betrekking tot de informatie die hier wordt verstrekt.
Hiermee bepaalt u de indeling van een object wanneer het wordt geëxporteerd naar onbeheerde code.
public enum class LayoutKind
public enum LayoutKind
[System.Serializable]
public enum LayoutKind
[System.Serializable]
[System.Runtime.InteropServices.ComVisible(true)]
public enum LayoutKind
type LayoutKind =
[<System.Serializable>]
type LayoutKind =
[<System.Serializable>]
[<System.Runtime.InteropServices.ComVisible(true)>]
type LayoutKind =
Public Enum LayoutKind
- Overname
- Kenmerken
Velden
| Name | Waarde | Description |
|---|---|---|
| Sequential | 0 | De leden van het object worden opeenvolgend ingedeeld, in de volgorde waarin ze worden weergegeven wanneer ze worden geëxporteerd naar onbeheerd geheugen. De leden worden ingedeeld volgens de verpakking die is opgegeven en Packkunnen niet-aaneengesloten zijn. |
| Explicit | 2 | De exacte positie van elk lid van een object in onbeheerd geheugen wordt expliciet bepaald, afhankelijk van de instelling van het Pack veld. Elk lid moet de FieldOffsetAttribute functie gebruiken om de positie van dat veld binnen het type aan te geven. |
| Auto | 3 | De runtime kiest automatisch een geschikte indeling voor de leden van een object in onbeheerd geheugen. Objecten die zijn gedefinieerd met dit opsommingslid, kunnen niet worden weergegeven buiten beheerde code. Als u dit probeert, wordt er een uitzondering gegenereerd. |
Voorbeelden
In het volgende voorbeeld ziet u de beheerde declaratie van de PtInRect functie, waarmee wordt gecontroleerd of een punt zich in een rechthoek bevindt en een Point structuur met sequentiële indeling en een Rect structuur met expliciete indeling definieert.
enum class Bool
{
False = 0,
True
};
[StructLayout(LayoutKind::Sequential)]
value struct Point
{
public:
int x;
int y;
};
[StructLayout(LayoutKind::Explicit)]
value struct Rect
{
public:
[FieldOffset(0)]
int left;
[FieldOffset(4)]
int top;
[FieldOffset(8)]
int right;
[FieldOffset(12)]
int bottom;
};
ref class NativeMethods
{
public:
[DllImport("user32.dll",CallingConvention=CallingConvention::StdCall)]
static Bool PtInRect( Rect * r, Point p );
};
int main()
{
try
{
Bool bPointInRect = (Bool)0;
Rect myRect = Rect( );
myRect.left = 10;
myRect.right = 100;
myRect.top = 10;
myRect.bottom = 100;
Point myPoint = Point( );
myPoint.x = 50;
myPoint.y = 50;
bPointInRect = NativeMethods::PtInRect( &myRect, myPoint );
if ( bPointInRect == Bool::True )
Console::WriteLine( "Point lies within the Rect" );
else
Console::WriteLine( "Point did not lie within the Rect" );
}
catch ( Exception^ e )
{
Console::WriteLine( "Exception : {0}", e->Message );
}
}
enum Bool
{
False = 0,
True
};
[StructLayout(LayoutKind.Sequential)]
public struct Point
{
public int x;
public int y;
}
[StructLayout(LayoutKind.Explicit)]
public struct Rect
{
[FieldOffset(0)] public int left;
[FieldOffset(4)] public int top;
[FieldOffset(8)] public int right;
[FieldOffset(12)] public int bottom;
}
internal static class NativeMethods
{
[DllImport("user32.dll", CallingConvention=CallingConvention.StdCall)]
internal static extern Bool PtInRect(ref Rect r, Point p);
};
class TestApplication
{
public static void Main()
{
try
{
Bool bPointInRect = 0;
Rect myRect = new Rect();
myRect.left = 10;
myRect.right = 100;
myRect.top = 10;
myRect.bottom = 100;
Point myPoint = new Point();
myPoint.x = 50;
myPoint.y = 50;
bPointInRect = NativeMethods.PtInRect(ref myRect, myPoint);
if(bPointInRect == Bool.True)
Console.WriteLine("Point lies within the Rect");
else
Console.WriteLine("Point did not lie within the Rect");
}
catch(Exception e)
{
Console.WriteLine("Exception : " + e.Message);
}
}
}
' The program shows a managed declaration of the PtInRect function and defines Point
' structure with sequential layout and Rect structure with explicit layout. The PtInRect
' checks the point lies within the rectangle or not.
Imports System.Runtime.InteropServices
Enum Bool
[False] = 0
[True]
End Enum
<StructLayout(LayoutKind.Sequential)> _
Public Structure Point
Public x As Integer
Public y As Integer
End Structure
<StructLayout(LayoutKind.Explicit)> _
Public Structure Rect
<FieldOffset(0)> Public left As Integer
<FieldOffset(4)> Public top As Integer
<FieldOffset(8)> Public right As Integer
<FieldOffset(12)> Public bottom As Integer
End Structure
Friend Class NativeMethods
<DllImport("user32.dll", CallingConvention := CallingConvention.StdCall)> _
Friend Shared Function PtInRect(ByRef r As Rect, p As Point) As Bool
End Function
End Class
Class TestApplication
Public Shared Sub Main()
Try
Dim bPointInRect As Bool = 0
Dim myRect As New Rect()
myRect.left = 10
myRect.right = 100
myRect.top = 10
myRect.bottom = 100
Dim myPoint As New Point()
myPoint.x = 50
myPoint.y = 50
bPointInRect = NativeMethods.PtInRect(myRect, myPoint)
If bPointInRect = Bool.True Then
Console.WriteLine("Point lies within the Rect")
Else
Console.WriteLine("Point did not lie within the Rect")
End If
Catch e As Exception
Console.WriteLine(("Exception : " + e.Message.ToString()))
End Try
End Sub
End Class
Opmerkingen
Deze opsomming wordt gebruikt met StructLayoutAttribute. De algemene taalruntime maakt standaard gebruik van de Auto indelingswaarde. Als u indelingsproblemen met betrekking tot de Auto-waarde, C#, Visual Basic en C++ compilers wilt verminderen, geeft u Sequential indeling op voor waardetypen.
Important
Het StructLayoutAttribute.Pack veld bepaalt de uitlijning van gegevensvelden en is dus van invloed op de indeling, ongeacht de LayoutKind waarde die u opgeeft. Standaard is de waarde Pack 0, wat de standaardverpakkingsgrootte voor het huidige platform aangeeft. Wanneer u bijvoorbeeld de Explicit indelingswaarde gebruikt en velduitlijningen opgeeft op bytegrenzen, moet u instellen Pack op 1 om het gewenste resultaat te krijgen.