CodeBlanks Logo Icon CodeBlanks

StructLayout

C# kursu · Uzman · Ders 15/47

StructLayout ile bellek yerleşimini kontrol etmeyi öğrenirsin.

StructLayout nedir?

StructLayout attribute'ü, bir struct veya class'ın bellek düzenini kontrol eder. [StructLayout(LayoutKind.Sequential)] alanları bildirim sırasına göre dizer; bu, C tarzı struct'larla uyumludur ve en yaygın seçenektir.

LayoutKind.Explicit ile [FieldOffset(...)] kullanarak her alanın yerini elle belirtebilirsin. Bu, C tarzı struct'larla uyumlu bellek düzeni istediğin yerel API çağrılarında kritiktir.

Explicit ve FieldOffset

LayoutKind.Explicit ile her alana [FieldOffset(0)] gibi bir konum verilir. Bu, bir alanın farklı türlerle aynı belleği paylaşmasını (union) sağlar.

Örneğin 4 baytlık bir int ve 4 baytlık bir float aynı offset'te paylaşılabilir. Bu teknik, C birliği (union) davranışını C#'a taşır ve düşük seviye veri yapılarında kullanışlıdır.

Uygulama Point struct'ı tanımla

[StructLayout(LayoutKind.Sequential)] struct Point { public int X; public int Y; } struct'ını tanımla. Main'de Point p; p.X = 3; p.Y = 4; yaz, Console.WriteLine(p.X + p.Y); ile toplamı yazdır.

Örnek çözümü göster
[StructLayout(LayoutKind.Sequential)] struct Point { public int X; public int Y; } yaz. Main'de Point p; p.X = 3; p.Y = 4; Console.WriteLine(p.X + p.Y);
Örnek çözüm:
using System;
using System.Runtime.InteropServices;

[StructLayout(LayoutKind.Sequential)]
struct Point
{
    public int X;
    public int Y;
}

class Program
{
    static void Main()
    {
        Point p;
        p.X = 3;
        p.Y = 4;
        Console.WriteLine(p.X + p.Y);
    }
}

Kendini test et

  1. Hangi LayoutKind alanları bildirim sırasına dizer?

    • Auto
    • Explicit
    • Random
    • Sequential
    Cevabı göster

    Sequential — Doğru. Sequential, alanları bildirim sırasına göre dizer.

  2. StructLayout attribute'ünü tamamla

    [____(LayoutKind.Sequential)] struct Point { public int X; public int Y; }
    Cevabı göster
    [StructLayout(LayoutKind.Sequential)] struct Point { public int X; public int Y; }
  3. LayoutKind türlerini eşleştir

    LayoutKind.Sequential
    Bildirim sırasına
    LayoutKind.Explicit
    Elle offset
    FieldOffset(0)
    Offset 0
    StructLayout
    Düzen attribute'ü

Uzman bölümündeki tüm dersler