다음을 통해 공유


비관리형 형식(C# 참조)

형식이 다음 형식 중 하나인 경우에는 관리되지 않는 형식입니다.

  • sbyte, byte, short, ushort, int, uint, long, ulong, nint, nuint, char, float, double, decimal, 또는 bool
  • 임의의 열거형 형식
  • 임의의 포인터 형식
  • 멤버가 모두 관리되지 않는 형식인 튜플
  • 관리되지 않는 형식의 필드만 포함하는 임의의 사용자 정의 구조체 형식

unmanaged 제약 조건을 사용하여 형식 매개 변수가 nullable이 아니며 비포인터 및 비관리형 형식임을 지정할 수 있습니다.

다음 예와 같이 관리되지 않는 형식의 필드만 포함하는 생성된 구조체 형식도 관리되지 않습니다.

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

제네릭 구조체는 관리되는 구조체 및 관리되지 않는 구조체 형식 모두의 원본일 수 있습니다. 위의 예에서는 제네릭 구조체 Coords<T>를 정의하고 관리되지 않는 생성 형식의 예를 보여 줍니다. 관리되는 형식의 예는 Coords<object>입니다. 관리되는 object 형식의 필드가 있으므로 관리됩니다. 모든 생성 형식을 관리되지 않는 형식으로 하려면 제네릭 구조체의 정의에서 unmanaged 제약 조건을 사용합니다.

public struct Coords<T> where T : unmanaged
{
    public T X;
    public T Y;
}

C# 언어 사양

자세한 내용은 C# 언어 사양포인터 형식 섹션을 참조하세요.

참고 항목