LayoutKind Enum
Definisi
Penting
Beberapa informasi terkait produk prarilis yang dapat diubah secara signifikan sebelum dirilis. Microsoft tidak memberikan jaminan, tersirat maupun tersurat, sehubungan dengan informasi yang diberikan di sini.
Mengontrol tata letak objek ketika diekspor ke kode tidak terkelola.
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
- Warisan
- Atribut
Bidang
Auto | 3 | Runtime secara otomatis memilih tata letak yang sesuai untuk anggota objek dalam memori yang tidak dikelola. Objek yang ditentukan dengan anggota enumerasi ini tidak dapat diekspos di luar kode terkelola. Mencoba melakukannya menghasilkan pengecualian. |
Explicit | 2 | Posisi yang tepat dari setiap anggota objek dalam memori yang tidak dikelola secara eksplisit dikontrol, tunduk pada pengaturan Pack bidang. Setiap anggota harus menggunakan FieldOffsetAttribute untuk menunjukkan posisi bidang tersebut dalam jenis . |
Sequential | 0 | Anggota objek ditata secara berurutan, dalam urutan di mana mereka muncul ketika diekspor ke memori yang tidak dikelola. Anggota ditata sesuai dengan kemasan yang ditentukan dalam Pack, dan dapat tidak berdamai. |
Contoh
Contoh berikut menunjukkan deklarasi fungsi terkelola PtInRect
, yang memeriksa apakah titik terletak dalam persegi panjang, dan menentukan Point
struktur dengan tata letak Berurutan dan Rect
struktur dengan tata letak Eksplisit.
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
Keterangan
Enumerasi ini digunakan dengan StructLayoutAttribute. Runtime bahasa umum menggunakan Auto
nilai tata letak secara default. Untuk mengurangi masalah terkait tata letak yang terkait dengan Auto
nilai, pengkompilasi C#, Visual Basic, dan C++ tentukan Sequential
tata letak untuk jenis nilai.
Penting
Bidang StructLayoutAttribute.Pack mengontrol perataan bidang data, dan dengan demikian memengaruhi tata letak terlepas dari nilai yang LayoutKind Anda tentukan. Secara default, nilainya Pack adalah 0, yang menunjukkan ukuran pengemasan default untuk platform saat ini. Misalnya, saat Anda menggunakan Explicit
nilai tata letak dan menentukan perataan bidang pada batas byte, Anda harus mengatur Pack ke 1 untuk mendapatkan hasil yang diinginkan.