Notatka
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
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 lub typu wyliczenia.
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 przypadku typu wyliczenia wynik sizeof operatora jest rozmiarem podstawowego typu całkowitego wyliczenia. Wynik jest obliczany w czasie kompilacji.
W niebezpiecznym kodzie można użyć sizeof dowolnegovoid typu, w tym typów skonstruowanych z parametrów typu.
Note
Funkcja w wersji zapoznawczej bezpieczeństwa pamięci dostępna w języku C# 15 umożliwia korzystanie z sizeof dowolnego niezarządzanego typu poza kontekstem unsafe .
- 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 typu wyliczenia to rozmiar jego podstawowego typu całkowitego. Ten rozmiar jest stałą czasu kompilacji. Jeśli podstawowy typ wyliczenia zdefiniowanego w przywoływanego zestawu zmieni się później, kod zastosowany
sizeofdo tego wyliczenia musi zostać ponownie skompilowany, aby zaobserwować nowy rozmiar. - 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ę sizeof operatorówspecyfikacji 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