LayoutKind Wyliczenie

Definicja

Steruje układem obiektu podczas eksportowania do niezarządzanego kodu.

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

Pola

Nazwa Wartość Opis
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.

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

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.

Dotyczy

Produkt Wersje
.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