Udostępnij za pośrednictwem


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ż