StructLayout
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
-
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.
-
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; } -
LayoutKind türlerini eşleştir
- LayoutKind.Sequential
- Bildirim sırasına
- LayoutKind.Explicit
- Elle offset
- FieldOffset(0)
- Offset 0
- StructLayout
- Düzen attribute'ü