LayoutKind Wyliczenie
Definicja
Ważne
Niektóre informacje odnoszą się do produktu w wersji wstępnej, który może zostać znacząco zmodyfikowany przed wydaniem. Firma Microsoft nie udziela żadnych gwarancji, jawnych lub domniemanych, w odniesieniu do informacji podanych w tym miejscu.
Steruje układem obiektu podczas eksportowania do niezarządzanego kodu.
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
- Dziedziczenie
- Atrybuty
Pola
Auto | 3 | Środowisko uruchomieniowe automatycznie wybiera odpowiedni układ dla elementów członkowskich obiektu w pamięci niezarządzanej. Nie można uwidocznić obiektów zdefiniowanych za pomocą tego elementu członkowskiego wyliczenia poza kodem zarządzanym. Próba wykonania tej czynności powoduje wygenerowanie wyjątku. |
Explicit | 2 | Dokładne położenie każdego elementu członkowskiego obiektu w pamięci niezarządzanej jest jawnie kontrolowane, z zastrzeżeniem ustawienia Pack pola. Każdy element członkowski musi użyć elementu FieldOffsetAttribute , aby wskazać położenie tego pola w typie. |
Sequential | 0 | Elementy członkowskie obiektu są rozmieszczone sekwencyjnie, w kolejności, w której są wyświetlane podczas eksportowania do niezarządzanej pamięci. Składowe są określone zgodnie z opakowaniem określonym w Pack, i mogą być niekontencyjne. |
Przykłady
W poniższym przykładzie pokazano zarządzaną deklarację PtInRect
funkcji, która sprawdza, czy punkt znajduje się w prostokątze, i definiuje Point
strukturę z układem sekwencyjnym i Rect
strukturą z układem jawnym.
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
Uwagi
Ta wyliczenie jest używana z elementem StructLayoutAttribute. Środowisko uruchomieniowe języka wspólnego domyślnie używa Auto
wartości układu. Aby zmniejszyć problemy związane z układem skojarzone z wartością Auto
, kompilatory języka C#, Visual Basic i C++ określają Sequential
układ typów wartości.
Ważne
Pole StructLayoutAttribute.Pack kontroluje wyrównanie pól danych, a tym samym wpływa na układ niezależnie od LayoutKind określonej wartości. Domyślnie wartość to Pack 0, która wskazuje domyślny rozmiar pakowania dla bieżącej platformy. Na przykład w przypadku użycia Explicit
wartości układu i określenia wyrównań pól na granicach bajtów należy ustawić Pack wartość 1, aby uzyskać żądany wynik.