C#에서 구조체를 사용할 때 다음과 같은 점들에 주의할 필요가 있다.
1. 구조체 고정크기 변수
이전 C# 1.1버전까지는 바이트 배열, 문자열 배열 등의 고정크기 변수를 사용할 수 없었다.
public struct MyArray { public char[] pathName; private int reserved; }
C# 2.0 버전부터는 아래와 같이 고정크기 변수를 사용할 수 있다.
public struct MyArray // This code must appear in an unsafe block { public fixed char pathName[128]; }
>> 참고: 고정 크기 버퍼(C# 프로그래밍 가이드)
2. 구조체 크기
보통 구조체를 선언해서 사용할 때 아래와 같이 쓴다.
특히 네트워크로 전송이라도 할 때는 Serializable과 LayoutKind.Sequential 속성을 자주 사용한다.
[Serializable, StructLayout(LayoutKind.Sequential)]
public struct command_rsp // 6 bytes
{
public uint resultCode;
public short targetSysId;
}
그러면, 위 구조체를 Marshal.SizeOf(command_rsp)로 크기를 구하면 6바이트가 나올 것 같지만 8바이트가 나온다.
그 이유는 32비트 컴퓨터에서 실행되기 때문에 32/8=4, 즉 4의 배수만큼 크기가 결정되기 때문이다.
따라서 이런 경우 정확한 크기값을 구하기 위해서는 다음과 같이 StructLayout.Pack 값을 지정해야 한다.
[Serializable, StructLayout(LayoutKind.Sequential, Pack = 2)]
public struct command_rsp // 6 bytes
{
public uint resultCode;
public short targetSysId;
}
위에서 값을 2로 지정을 했는데, 위 구조체는 2바이트만큼 채워도 충분히 정확하게 나오기 때문이다.
>> 참고: #pragma pack 명령으로 구조체 패킹하기(C/C++)
'Tech: > .NET·C#' 카테고리의 다른 글
ASP.NET 파일 다운로드 제어 (0) | 2008.06.26 |
---|---|
MSMQ 메시지 보내는 방법 (0) | 2008.06.26 |
Stack overflow? (0) | 2008.06.26 |
Smart Client (Web-embedded) 보안 (0) | 2008.06.26 |
C/C++로 넘겨준 한글 문자열 다시 받아 처리하기 (0) | 2008.06.26 |