Baca dalam bahasa Inggris

Bagikan melalui


LayoutKind Enum

Definisi

Mengontrol tata letak objek ketika diekspor ke kode tidak terkelola.

C#
public enum LayoutKind
C#
[System.Serializable]
public enum LayoutKind
C#
[System.Serializable]
[System.Runtime.InteropServices.ComVisible(true)]
public enum LayoutKind
Warisan
LayoutKind
Atribut

Bidang

Nama Nilai Deskripsi
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.

C#
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);
      }
   }
}

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.

Berlaku untuk

Produk Versi
.NET Core 1.0, Core 1.1, Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7, 8, 9
.NET Framework 1.1, 2.0, 3.0, 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
.NET Standard 1.0, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 2.0, 2.1
UWP 10.0