고정 크기 버퍼(C# 프로그래밍 가이드)

C# 2.0에서 fixed 문을 사용하여 데이터 구조에 고정 크기의 배열을 만들 수 있습니다. 고정 크기의 배열은 다른 언어로 작성된 코드와 같은 기존 코드, 기존 DLL 또는 COM 프로젝트를 사용하여 작업할 때 유용합니다. 고정 배열에는 일반 구조체 멤버에 허용되는 특성이나 한정자를 모두 사용할 수 있습니다. 유일한 제한 사항은 배열 형식이 bool, byte, char, short, int, long, sbyte, ushort, uint, ulong, float 또는 double이어야 한다는 점입니다.

private fixed char name[30];

설명

이전 버전의 C#에서는 C++ 스타일의 고정 크기 구조를 선언하기가 어려웠습니다. 배열을 포함하는 C# 구조체에 배열 요소가 포함되지 않은 대신 요소에 대한 참조가 들어 있기 때문입니다.

C# 2.0에서는 unsafe 코드 블록에 사용되는 구조체에 고정 크기 배열을 포함할 수 있습니다.

예를 들어, C# 2.0 이전 버전에서는 다음과 같은 struct의 크기가 8바이트입니다. 여기서 pathName 배열은 힙 할당된 배열에 대한 참조입니다.

public struct MyArray
{
    public char[] pathName;
    private int reserved;
}

C# 2.0에서는 포함된 배열을 사용하여 struct를 선언할 수 있습니다.

public struct MyArray // This code must appear in an unsafe block
{
    public fixed char pathName[128];
}

이 구조에서 pathName 배열은 크기와 위치가 고정되어 있으므로 다른 안전하지 않은 코드와 함께 사용할 수 있습니다.

128 요소 char 배열의 크기는 256바이트입니다. 고정 크기 char 버퍼에는 인코딩과 상관없이 문자 당 항상 2바이트가 사용됩니다. 이는 CharSet = CharSet.Auto 또는 CharSet = CharSet.Ansi를 사용하여 char 버퍼를 API 메서드나 구조체로 마샬링하는 경우에도 마찬가지입니다. 자세한 내용은 CharSet을 참조하십시오.

다른 일반적인 고정 크기 배열로는 bool 배열이 있습니다. bool 배열의 요소는 크기가 항상 1바이트입니다. bool 배열은 비트 배열이나 버퍼를 만들기에 적당하지 않습니다.

참고

stackalloc을 사용하여 만든 메모리를 제외하고 C# 컴파일러와 CLR(공용 언어 런타임)에서는 어떠한 보안 버퍼 오버런 검사도 수행하지 않습니다. 따라서 안전하지 않은 코드와 마찬가지로 항상 주의해야 합니다.

안전하지 않은 버퍼는 다음과 같은 점에서 일반적인 배열과 다릅니다.

  • 안전하지 않은 버퍼는 안전하지 않은 컨텍스트에만 사용할 수 있습니다.

  • 안전하지 않은 버퍼는 항상 벡터(1차원 배열)입니다.

  • 배열 선언에는 char id[8] 같이 카운트가 포함되어야 합니다. char id[]를 대신 사용할 수 없습니다.

  • 안전하지 않은 버퍼는 안전하지 않은 컨텍스트에서만 구조체의 인스턴스 필드가 될 수 있습니다.

참고 항목

작업

방법: PInvoke를 사용하여 관리 코드로부터 네이티브 DLL 호출
방법: PInvoke를 사용하여 배열 마샬링
방법: PInvoke를 사용하여 포함 포인터 마샬링
방법: PInvoke를 사용하여 함수 포인터 마샬링
방법: PInvoke를 사용하여 문자열 마샬링

참조

fixed 문(C# 참조)

개념

C# 프로그래밍 가이드
안전하지 않은 코드 및 포인터(C# 프로그래밍 가이드)
배열에 대한 기본 마샬링