Freigeben über


Operator „sizeof“: Ermitteln des Arbeitsspeicherbedarfs eines bestimmten Typs

Der operator sizeof gibt die Anzahl der Byte zurück, die von einer Variablen eines bestimmten Typs belegt sind. Im sicheren Code muss das Argument für den sizeof Operator der Name eines integrierten nicht verwalteten Typs sein.

Die in der folgenden Tabelle dargestellten Ausdrücke werden zur Kompilierungszeit zu den entsprechenden Konstantenwerten ausgewertet und erfordern keinen unsicheren Kontext:

Ausdruck Konstanter Wert
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

Die Größe eines integrierten, nicht verwalteten Typs ist eine Kompilierungszeitkonstante.

Im unsicheren Code können Sie wie folgt verwenden sizeof :

  • Ein Typparameter, der auf einen nicht verwalteten Typ beschränkt ist, gibt die Größe dieses nicht verwalteten Typs zur Laufzeit zurück.
  • Ein verwalteter Typ oder ein Zeigertyp gibt die Größe des Bezugs oder Zeigers zurück, nicht die Größe des Objekts, auf das es verweist.

Im folgenden Beispiel wird die Verwendung des sizeof-Operators veranschaulicht:

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)}");
    }
}

Der operator sizeof gibt die Anzahl der Byte zurück, die von der Common Language Runtime im verwalteten Speicher zugewiesen wurden. Wie im vorherigen Beispiel veranschaulicht, enthält dieser Wert für Strukturtypen alle Auffüllzeichen. Das Ergebnis des sizeof-Operators unterscheidet sich möglicherweise vom Ergebnis der Marshal.SizeOf-Methode, die die Größe eines Typs in nicht verwalteten Arbeitsspeicher zurückgibt.

Wichtig

Der von sizeof zurückgegebene Wert kann vom Ergebnis Marshal.SizeOf(Object)abweichen, wodurch die Größe des Typs im nicht verwalteten Speicher zurückgegeben wird.

C#-Sprachspezifikation

Weitere Informationen finden Sie im Abschnitt Der sizeof-Operator in der C#-Sprachspezifikation.

Siehe auch