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 nicht verwalteten Typs oder eines Typparameters sein, der so eingeschränkt ist, dass er ein nicht verwalteter Typ ist. Nicht verwaltete Typen umfassen alle numerischen Typen, Enumerationstypen und Tupel- und Strukturtypen, bei denen alle Member nicht verwaltete Typen sind.

Die in der folgenden Tabelle dargestellten Ausdrücke werden zur Kompilierzeit 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

Im unsicheren Code kann das Argument für sizeof Zeigertypen und verwaltete Typen enthalten, einschließlich nicht eingeschränkter Typparameter. Beispiele sind object und string.

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.

Wenn das Argument ein verwalteter Typ ist, gibt der sizeof-Operator in unsicherem Code die Größe eines Verweises und nicht die Anzahl der Bytes zurück, die einer Instanz dieses Typs zugeordnet sind.

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