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.