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


Posted by 떼르미
,


자바스크립트를 허용해주세요!
Please Enable JavaScript![ Enable JavaScript ]