operator sizeof - menentukan kebutuhan memori untuk jenis tertentu
Operator sizeof
mengembalikan jumlah byte yang ditempati oleh variabel dari jenis tertentu. Dalam kode aman, argumen ke operator sizeof
harus berupa nama jenis yang tidak dikelola atau parameter jenis yang dibatasi menjadi jenis yang tidak dikelola. Jenis yang tidak dikelola mencakup semua jenis numerik, jenis enum, dan jenis tuple dan struct di mana semua anggota adalah jenis yang tidak dikelola.
Ekspresi yang disajikan dalam tabel berikut dievaluasi dalam waktu kompilasi ke nilai konstanta terkait dan tidak memerlukan konteks yang tidak aman:
Ekspresi | Nilai konstanta |
---|---|
sizeof(sbyte) |
1 |
sizeof(byte) |
1 |
sizeof(short) |
2 |
sizeof(ushort) |
2 |
sizeof(int) |
4 |
sizeof(uint) |
4 |
sizeof(long) |
8 |
sizeof(ulong) |
8 |
sizeof(char) |
2 |
sizeof(float) |
4 |
sizeof(double) |
8 |
sizeof(decimal) |
16 |
sizeof(bool) |
1 |
Dalam kode yang tidak aman, argumen ke sizeof
dapat menyertakan jenis penunjuk dan jenis terkelola, termasuk parameter jenis yang tidak dibatasi. Contohnya termasuk object
dan string
.
Contoh berikut menunjukkan penggunaan operator sizeof
:
public struct Point
{
public Point(byte tag, double x, double y) => (Tag, X, Y) = (tag, x, y);
public byte Tag { get; }
public double X { get; }
public double Y { get; }
}
public class SizeOfOperator
{
public static void Main()
{
Console.WriteLine(sizeof(byte)); // output: 1
Console.WriteLine(sizeof(double)); // output: 8
DisplaySizeOf<Point>(); // output: Size of Point is 24
DisplaySizeOf<decimal>(); // output: Size of System.Decimal is 16
unsafe
{
Console.WriteLine(sizeof(Point*)); // output: 8
}
}
static unsafe void DisplaySizeOf<T>() where T : unmanaged
{
Console.WriteLine($"Size of {typeof(T)} is {sizeof(T)}");
}
}
Operator sizeof
mengembalikan jumlah byte yang dialokasikan oleh common language runtime dalam memori terkelola. Untuk struktur jenis , nilai tersebut mencakup padding apa pun, seperti yang ditunjukkan dalam contoh sebelumnya. Hasil operator sizeof
mungkin berbeda dari hasil metode Marshal.SizeOf, yang mengembalikan ukuran jenis dalam memori yang tidak dikelola.
Dalam kode tidak aman, ketika argumen adalah jenis terkelola, operator sizeof
mengembalikan ukuran referensi, bukan jumlah byte yang dialokasikan untuk instans jenis tersebut.
Penting
Nilai yang dikembalikan oleh sizeof
dapat berbeda dari hasil Marshal.SizeOf(Object), yang mengembalikan ukuran jenis dalam memori yang tidak dikelola.
Spesifikasi bahasa C#
Untuk informasi selengkapnya, lihat bagian operator sizeof pada dari spesifikasi bahasa C# .