Delen via


sizeof-operator - bepaal het geheugengebruik voor een gegeven type

De operator sizeof retourneert het aantal bytes dat wordt bezet door een variabele van een bepaald type. In veilige code moet het argument voor de operator de naam zijn van een ingebouwd, niet-beheerd type waarvan de sizeof grootte niet afhankelijk is van het platform.

De C#-taalreferentiedocumenten beschrijven de meest recent uitgebrachte versie van de C#-taal. Het bevat ook de eerste documentatie voor functies in openbare previews voor de aanstaande taalrelease.

De documentatie identificeert alle functies die voor het eerst zijn geïntroduceerd in de laatste drie versies van de taal of in de huidige openbare previews.

Aanbeveling

Raadpleeg het artikel over de versiegeschiedenis van de C#-taal om te achterhalen wanneer een functie voor het eerst is geïntroduceerd in C#.

De expressies die in de volgende tabel worden weergegeven, worden tijdens het compileren geëvalueerd op de bijbehorende constante waarden en vereisen geen onveilige context:

Uitdrukking Constante waarde
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

De grootte van de typen in de voorgaande tabel is een compilatieconstante.

In onveilige code kunt u elk niet-typevoid gebruikensizeof, inclusief typen die zijn samengesteld op basis van typeparameters.

  • De grootte van een verwijzing of aanwijzer is de grootte van een verwijzing of aanwijzer, niet de grootte van het object waarnaar het verwijst.
  • De grootte van een waardetype, onbeheerd of niet, is de grootte van een dergelijke waarde.
  • De grootte van een ref struct type is de grootte van de waarde. De grootte van elk ref veld is de grootte van een verwijzing of aanwijzer, niet de grootte van de waarde waarnaar wordt verwezen.

In het volgende voorbeeld ziet u het gebruik van de 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
            Console.WriteLine(sizeof(nint));  // output: 8 on 64-bit, 4 on 32-bit
            Console.WriteLine(sizeof(nuint)); // output: 8 on 64-bit, 4 on 32-bit
            Console.WriteLine(sizeof(Span<int>));  // output: 16 on 64-bit, 12 on 32-bit
        }
    }

    static unsafe void DisplaySizeOf<T>() where T : unmanaged
    {
        Console.WriteLine($"Size of {typeof(T)} is {sizeof(T)}");
    }
}

De operator sizeof retourneert het aantal bytes dat is toegewezen door de algemene taalruntime in het beheerde geheugen. Voor struct typen bevat die waarde enige opvulling, zoals het voorgaande voorbeeld aantoont. Het resultaat van de sizeof-operator kan verschillen van het resultaat van de Marshal.SizeOf methode, die de grootte van een type in onbeheerde geheugen retourneert.

Belangrijk

De waarde die door sizeof wordt geretourneerd, kan verschillen van het resultaat van Marshal.SizeOf(Object), wat de grootte van het type in onbeheerd geheugen retourneert.

C#-taalspecificatie

Zie De grootte van de operator sectie van de C#-taalspecificatievoor meer informatie.

Zie ook