LayoutKind Enumeráció
Definíció
Fontos
Egyes információk olyan, kiadás előtti termékekre vonatkoznak, amelyek a kiadásig még jelentősen módosulhatnak. A Microsoft nem vállal kifejezett vagy törvényi garanciát az itt megjelenő információért.
Szabályozza az objektumok elrendezését, amikor nem felügyelt kódba exportálják.
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
- Öröklődés
- Attribútumok
Mezők
| Name | Érték | Description |
|---|---|---|
| Sequential | 0 | Az objektum tagjai egymás után vannak elhelyezve, abban a sorrendben, amelyben megjelennek, amikor nem felügyelt memóriába exportálják őket. A tagok a megadott Packcsomagolás szerint vannak elhelyezve, és nem lehetnek egyértelműek. |
| Extended | 1 | |
| Explicit | 2 | A nem felügyelt memóriában lévő objektumok minden egyes tagjának pontos pozícióját a mező beállításától Pack függően explicit módon szabályozhatja. Minden tagnak a FieldOffsetAttribute típuson belül kell jeleznie a mező pozícióját. |
| Auto | 3 | A futtatókörnyezet automatikusan kiválasztja a megfelelő elrendezést a nem felügyelt memóriában lévő objektumok tagjainak. Az enumerálási taggal definiált objektumok nem tehetők közzé a felügyelt kódon kívül. Ennek megkísérlése kivételt eredményez. |
Példák
Az alábbi példa a függvény felügyelt deklarációját PtInRect mutatja be, amely ellenőrzi, hogy egy pont egy téglalapon belül helyezkedik-e Point el, és szekvenciális elrendezésű és explicit elrendezésű struktúrát Rect határoz meg.
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
Megjegyzések
Ez az enumerálás a .StructLayoutAttribute A közös nyelvi futtatókörnyezet alapértelmezés szerint az Auto elrendezési értéket használja. A Auto értékhez kapcsolódó elrendezéssel kapcsolatos problémák csökkentéséhez a C#, a Visual Basic és a C++ fordítók Sequential elrendezést adja meg az értéktípusokhoz.
Important
A StructLayoutAttribute.Pack mező szabályozza az adatmezők igazítását, így a megadott értéktől függetlenül hatással van az elrendezésre LayoutKind . Alapértelmezés szerint a 0 érték Pack , amely az aktuális platform alapértelmezett csomagolási méretét jelzi. Ha például az Explicit elrendezési értéket használja, és mezőigazításokat ad meg a bájthatárokon, a kívánt eredmény eléréséhez 1 értéket kell beállítania Pack .