Favicon

Unmanaged types

Peponi11/21/20242m

C#
SyntaxTypeValuePointer

1. Introduction

다음 형식은 비관리형 형식이다.

2. 구조체

구조체의 경우 형태에 따라 관리형, 비관리형이 될 수 있다.

관리형
public struct Foo
{
    public int Bar;
    public string Baz;
}
비관리형
public struct Bar
{
    public int Baz;
    public int Qux;
}

관리형 형식인지 파악하기 위해 CompilerServicesRuntimeHelpers를 이용할 수 있다.

using System.Runtime.CompilerServices;
 
static void Main(string[] args)
{
    Console.WriteLine(RuntimeHelpers.IsReferenceOrContainsReferences<Foo>());
    Console.WriteLine(RuntimeHelpers.IsReferenceOrContainsReferences<Bar>());
}
 
/* output:
True
False
*/

3. 제네릭 구조체

제네릭 구조체의 경우 형식 매개 변수에 따라 관리형, 비관리형 구조체가 될 수 있다.

using System.Runtime.CompilerServices;
 
public struct Foo<T>
{
    public T Bar;
    public T Baz;
}
 
static void Main(string[] args)
{
    Console.WriteLine(RuntimeHelpers.IsReferenceOrContainsReferences<Foo<int>>());
    Console.WriteLine(RuntimeHelpers.IsReferenceOrContainsReferences<Foo<string>>());
}
 
/* output:
False
True
*/

형식 매개 변수를 비관리형으로 강제하고 싶은 경우 unmanaged 키워드를 이용하여 제약 조건을 걸 수 있다.

using System.Runtime.CompilerServices;
 
public struct Foo<T> where T : unmanaged
{
    public T Bar;
    public T Baz;
}
    
static void Main(string[] args)
{
    Console.WriteLine(RuntimeHelpers.IsReferenceOrContainsReferences<Foo<int>>());      // OK
    Console.WriteLine(RuntimeHelpers.IsReferenceOrContainsReferences<Foo<string>>());   // CS8377
}

4. 참조 자료