Поделиться через


Оператор sizeof — определение потребностей памяти для заданного типа

Оператор sizeof возвращает количество байтов, занятых переменной заданного типа. В безопасном коде аргумент оператора sizeof должен быть именем неуправляемого типа или параметром типа, ограниченным, чтобы быть неуправляемым типом. Неуправляемые типы включают все числовые типы, перечисления, а также кортежи и типы структур, в которых все члены являются неуправляемыми типами.

Выражения, представленные в следующей таблице, оцениваются во время компиляции в соответствующие константные значения и не требуют небезопасного контекста:

Выражение Константное значение
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

В небезопасном коде аргумент с sizeof может включать типы указателей и управляемые типы, в том числе неограниченные параметры типа. Примеры включают object и string.

В следующем примере показано использование оператора 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)}");
    }
}

Оператор sizeof возвращает количество байтов, выделенных средой CLR в управляемой памяти. Для типов структур , это значение включает любое заполнение, как показано в предыдущем примере. Результат оператора sizeof может отличаться от результата метода Marshal.SizeOf, который возвращает размер типа в неуправляемой памяти.

В небезопасном коде, если аргумент является управляемым типом, оператор sizeof возвращает размер ссылки, а не количество байтов, выделенных для экземпляра этого типа.

Важный

Значение, возвращаемое sizeof, может отличаться от результата Marshal.SizeOf(Object), который возвращает размер типа в неуправляемой памяти.

Спецификация языка C#

Дополнительные сведения см. в спецификации языка C# в разделе Оператор sizeof.

См. также