Introduction
구조체
구조체의 경우 형태에 따라 관리형, 비관리형이 될 수 있다.
다음 구조체는 관리형이다.
public struct Foo { public int Bar; public string Baz; }
관리형 형식인지 파악하기 위해
CompilerServices
의 RuntimeHelpers를 이용할 수 있다.using System.Runtime.CompilerServices; static void Main(string[] args) { Console.WriteLine(RuntimeHelpers.IsReferenceOrContainsReferences<Foo>()); } /* output: True */
다음 구조체는 비관리형이다.
public struct Foo { public int Bar; public int Baz; }
using System.Runtime.CompilerServices; static void Main(string[] args) { Console.WriteLine(RuntimeHelpers.IsReferenceOrContainsReferences<Foo>()); } /* output: False */
제네릭 구조체
제네릭 구조체의 경우 형식 매개 변수에 따라 관리형, 비관리형 구조체가 될 수 있다.
public struct Foo<T> { public T Bar; public T Baz; }
using System.Runtime.CompilerServices; static void Main(string[] args) { Console.WriteLine(RuntimeHelpers.IsReferenceOrContainsReferences<Foo<int>>()); Console.WriteLine(RuntimeHelpers.IsReferenceOrContainsReferences<Foo<string>>()); } /* output: False True */
형식 매개 변수를 비관리형으로 강제하고 싶은 경우 unmanaged 키워드를 이용하여 제약 조건을 걸 수 있다.
public struct Foo<T> where T: unmanaged { public T Bar; public T Baz; }
using System.Runtime.CompilerServices; static void Main(string[] args) { Console.WriteLine(RuntimeHelpers.IsReferenceOrContainsReferences<Foo<int>>()); // OK Console.WriteLine(RuntimeHelpers.IsReferenceOrContainsReferences<Foo<string>>()); // CS8377 }