Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Operator sizeof zwraca liczbę bajtów zajmowanych przez zmienną danego typu. W bezpiecznym kodzie argument sizeof operatora musi być nazwą wbudowanego typu niezarządzanego , którego rozmiar nie jest zależny od platformy.
Dokumentacja języka C# zawiera ostatnio wydaną wersję języka C#. Zawiera również początkową dokumentację dla funkcjonalności w publicznych wersjach testowych nadchodzącego wydania języka.
Dokumentacja identyfikuje dowolną funkcję po raz pierwszy wprowadzoną w ostatnich trzech wersjach języka lub w bieżącej publicznej wersji zapoznawczej.
Wskazówka
Aby dowiedzieć się, kiedy funkcja została po raz pierwszy wprowadzona w języku C#, zapoznaj się z artykułem dotyczącym historii wersji języka C#.
Wyrażenia przedstawione w poniższej tabeli są obliczane w czasie kompilacji do odpowiednich wartości stałych i nie wymagają niebezpiecznego kontekstu:
| Wyrażenie | Stała wartość |
|---|---|
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 |
Rozmiar typów w poprzedniej tabeli jest stałą czasu kompilacji.
W niebezpiecznym kodzie można użyć sizeof dowolnegovoid typu, w tym typów skonstruowanych z parametrów typu.
- Rozmiar typu odwołania lub wskaźnika to rozmiar odwołania lub wskaźnika, a nie rozmiar obiektu, z którym może się odwoływać.
- Rozmiar typu wartości, niezarządzany lub nie, jest rozmiarem takiej wartości.
- Rozmiar
ref structtypu to rozmiar wartości. Rozmiar każdegorefpola to rozmiar odwołania lub wskaźnika, a nie rozmiar wartości, do których się odwołuje.
W poniższym przykładzie pokazano użycie operatora 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)}");
}
}
Operator sizeof zwraca liczbę bajtów przydzielonych przez środowisko uruchomieniowe języka wspólnego w pamięci zarządzanej. W przypadku typów struktury ta wartość zawiera dowolne wypełnienie, jak pokazano w poprzednim przykładzie. Wynik operatora sizeof może różnić się od wyniku metody Marshal.SizeOf, która zwraca rozmiar typu w niezarządzanej pamięci.
Ważny
Wartość zwrócona przez sizeof może różnić się od wyniku Marshal.SizeOf(Object), który zwraca rozmiar typu w pamięci niezarządzanej.
Specyfikacja języka C#
Aby uzyskać więcej informacji, zobacz sekcję operator sizeof w specyfikacji języka C#.
Zobacz też
- operatory i wyrażenia języka C#
- operatory powiązane ze wskaźnikiem
- Typy wskaźników
- typy związane z pamięcią i zakresem
- Typy generyczne na platformie .NET