Typy niezarządzane (odwołanie w C#)
Typ jest typem niezarządzanym, jeśli jest to dowolny z następujących typów:
sbyte
,byte
, ,ushort
decimal
double
float
char
nuint
ulong
uint
nint
short
int
long
lubbool
- Dowolny typ wyliczenia
- Dowolny typ wskaźnika
- Krotka, której składowe są typu niezarządzanego
- Dowolny typ struktury zdefiniowany przez użytkownika, który zawiera tylko pola niezarządzanych typów.
Możesz użyć unmanaged
ograniczenia , aby określić, że parametr typu jest typem, który nie jest wskaźnikiem, niepodważalnym typem niezarządzanym.
Skonstruowany typ struktury, który zawiera pola tylko typów niezarządzanych, jest również niezarządzany, jak pokazano w poniższym przykładzie:
using System;
public struct Coords<T>
{
public T X;
public T Y;
}
public class UnmanagedTypes
{
public static void Main()
{
DisplaySize<Coords<int>>();
DisplaySize<Coords<double>>();
}
private unsafe static void DisplaySize<T>() where T : unmanaged
{
Console.WriteLine($"{typeof(T)} is unmanaged and its size is {sizeof(T)} bytes");
}
}
// Output:
// Coords`1[System.Int32] is unmanaged and its size is 8 bytes
// Coords`1[System.Double] is unmanaged and its size is 16 bytes
Struktura ogólna może być źródłem zarówno typów niezarządzanych, jak i zarządzanych. W poprzednim przykładzie zdefiniowano ogólną strukturę Coords<T>
i przedstawiono przykłady niezarządzanych typów skonstruowanych. Przykładem typu zarządzanego jest Coords<object>
. Jest on zarządzany, ponieważ ma pola object
typu, który jest zarządzany. Jeśli chcesz , aby wszystkie skonstruowane typy były typami niezarządzanym, użyj unmanaged
ograniczenia w definicji struktury ogólnej:
public struct Coords<T> where T : unmanaged
{
public T X;
public T Y;
}
specyfikacja języka C#
Aby uzyskać więcej informacji, zobacz sekcję Typy wskaźników specyfikacji języka C#.