Dela via


sizeof-operator – bestämma minnesbehovet för en given typ

Operatorn sizeof returnerar antalet byte som används av en variabel av en viss typ. I säker kod måste argumentet till sizeof-operatorn vara namnet på en ohanterad typ eller en typparameter som begränsad vara en ohanterad typ. Ohanterade typer omfattar alla numeriska typer, uppräkningstyper och tupler och struct-typer där medlemmarna är ohanterade typer.

Uttrycken som visas i följande tabell utvärderas i kompileringstid till motsvarande konstanta värden och kräver ingen osäker kontext:

Uttryck Konstant värde
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

I osäker kod kan argumentet till sizeof innehålla pekartyper och hanterade typer, inklusive okontrollerade typparametrar. Exempel är object och string.

I följande exempel visas användningen av operatorn 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)}");
    }
}

Operatorn sizeof ger tillbaka antalet byte som allokerats av Common Language Runtime i hanterat minne. För struct- typer innehåller detta värde all utfyllnad, vilket visas i föregående exempel. Resultatet av sizeof-operatorn kan skilja sig från resultatet av Marshal.SizeOf-metoden, som returnerar storleken på en typ i ohanterat minne.

När argumentet är en hanterad typ i osäker kod returnerar sizeof-operatorn storleken på en referens, inte antalet byte som allokerats för en instans av den typen.

Viktig

Värdet som returneras av sizeof kan skilja sig från resultatet av Marshal.SizeOf(Object), som returnerar storleken på typen i ohanterat minne.

Språkspecifikation för C#

Mer information finns i Avsnittet storlek på operatorn i C#-språkspecifikationen.

Se även