LayoutKind Enumerazione

Definizione

Controlla il layout di un oggetto quando viene esportato in codice non gestito.

public enum LayoutKind
[System.Serializable]
public enum LayoutKind
[System.Serializable]
[System.Runtime.InteropServices.ComVisible(true)]
public enum LayoutKind
Ereditarietà
LayoutKind
Attributi

Campi

Auto 3

Durante il runtime viene automaticamente scelto un layout appropriato per i membri di un oggetto nella memoria non gestita. Gli oggetti definiti con questo membro di enumerazione non possono essere esposti all'esterno del codice gestito. Qualsiasi tentativo di eseguire tale operazione genera un'eccezione.

Explicit 2

La posizione esatta di ogni membro di un oggetto nella memoria non gestita viene controllata in modo esplicito ed è soggetta all'impostazione del campo Pack. Ogni membro deve utilizzare FieldOffsetAttribute per indicare la posizione di tale campo all'interno del tipo.

Sequential 0

I membri dell'oggetto vengono disposti in sequenza, nell'ordine in cui si trovano al momento dell'esportazione nella memoria non gestita. I membri vengono disposti in base alla compressione specificata in Pack e possono essere non contigui.

Esempio

Nell'esempio PtInRect seguente viene illustrata la dichiarazione gestita della funzione, che verifica se un punto si trova all'interno di un rettangolo e definisce una Point struttura con layout sequenziale e una Rect struttura con layout esplicito.

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

Commenti

Questa enumerazione viene usata con StructLayoutAttribute. Common Language Runtime usa il valore di Auto layout per impostazione predefinita. Per ridurre i problemi correlati al layout associati al valore, C#, Visual Basic e compilatori C++ specificano Sequential il Auto layout per i tipi di valore.

Importante

Il StructLayoutAttribute.Pack campo controlla l'allineamento dei campi dati e influisce quindi sul layout indipendentemente dal LayoutKind valore specificato. Per impostazione predefinita, il valore di Pack è 0, che indica le dimensioni predefinite per la piattaforma corrente. Ad esempio, quando si usa il valore di Explicit layout e si specificano allineamenti dei campi sui limiti di byte, è necessario impostare Pack su 1 per ottenere il risultato desiderato.

Si applica a

Prodotto Versioni
.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