Unmanaged types
Peponi │ 11/21/2024 │ 2m
C#
SyntaxTypeValuePointer
Unmanaged types
11/21/2024
2m
Peponi
C#
SyntaxTypeValuePointer
1. Introduction
다음 형식은 비관리형 형식이다.
2. 구조체
구조체의 경우 형태에 따라 관리형, 비관리형이 될 수 있다.
public struct Foo
{
public int Bar;
public string Baz;
}
public struct Bar
{
public int Baz;
public int Qux;
}
관리형 형식인지 파악하기 위해 CompilerServices
의 RuntimeHelpers를 이용할 수 있다.
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
}