sizeof, operator — określenie zapotrzebowania na pamięć dla danego typu
Operator sizeof
zwraca liczbę bajtów zajmowanych przez zmienną danego typu. W bezpiecznym kodzie argument operatora sizeof
musi być nazwą niezarządzanego typu lub parametru typu, który jest ograniczony jako typ niezarządzany. Typy niezarządzane obejmują wszystkie typy liczbowe, typy wyliczeniowe oraz krotki i typy struktur, w których wszystkie elementy członkowskie są typami niezarządzanymi.
Wyrażenia przedstawione w poniższej tabeli są obliczane w czasie kompilacji do odpowiednich wartości stałych i nie wymagają niebezpiecznego kontekstu:
Wyrażenie | Stała wartość |
---|---|
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 |
W niebezpiecznym kodzie argument sizeof
może zawierać typy wskaźników i typy zarządzane, w tym nieograniczone parametry typu. Przykłady obejmują object
i string
.
W poniższym przykładzie pokazano użycie operatora 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
zwraca liczbę bajtów przydzielonych przez środowisko uruchomieniowe języka wspólnego w pamięci zarządzanej. W przypadku typów struktury ta wartość zawiera dowolne wypełnienie, jak pokazano w poprzednim przykładzie. Wynik operatora sizeof
może różnić się od wyniku metody Marshal.SizeOf, która zwraca rozmiar typu w niezarządzanej pamięci.
W niebezpiecznym kodzie, gdy argument jest typem zarządzanym, operator sizeof
zwraca rozmiar odwołania, a nie liczbę bajtów przydzielonych dla wystąpienia tego typu.
Ważny
Wartość zwrócona przez sizeof
może różnić się od wyniku Marshal.SizeOf(Object), który zwraca rozmiar typu w pamięci niezarządzanej.
Specyfikacja języka C#
Aby uzyskać więcej informacji, zobacz sekcję operator sizeof w specyfikacji języka C#.
Zobacz też
- operatory i wyrażenia języka C#
- operatory powiązane ze wskaźnikiem
- Typy wskaźników
- typy związane z pamięcią i zakresem
- Typy generyczne na platformie .NET