2011-03-10 4 views
3

C#을 처음 접했을 때 일반적으로 C 프로그래머가있어서 가장 좋은 방법을 찾지 못했습니다. 희망을 갖고 결정할 수 있도록 조언을 얻을 수 있기를 바랍니다.구조체에 배열 /리스트가 포함되어있을 때 구조체 목록 만들기/

struct structData 
{ 
    long type; 
    long myArray[50]; 
    string text; 
} 

내가 지속적으로 공개/전역 적 읽기/쓰기 수 이러한 구조체의 배열을 만들 :
나는 (내가 C에서 그것을 할 것이다 어떻게 이런 짓을)이 보이는 구조를 가지고있다.

structData arrayOfStructs[50]; 

는 목표는 다음과 같이 데이터에 액세스하는 것입니다 (그것이 나중에 액세스 할 수 있도록 내가 거기에 데이터를 저장해야합니다) :

arrayOfStructs[0].type = 123; 
arrayOfStructs[0].myArray[0] = 456; 

내가 구현하려고 이 C#에서 나는 다양한 오류 얻을 :
이 "myArray는"50에 고정 할 필요를,하지만 난 그것을 초기화하려고하면 그것이 안전하지 않은 지역
에 있어야합니다 "... = new ..."나는 오류를 얻을

,536,

배열 대신 배열 <>을 사용해야합니까? 성능 차이가 있습니까?
둘째, 구조체 대신 클래스를 만들고 생성자에서 배열을 초기화 한 다음 객체 목록/배열을 만들어야합니까? 어떻게 구현할 것인가?
예, 나는 longs를 사용해야합니다. 큰 물체, 작은 가능성이 불변 "객체"에 대한 구조체에 대한

+0

배열의 초기화를 포함하여 나머지 코드 게시 – smartcaveman

+5

구문이 비슷하다고해서 C#으로 C 코드를 작성해야한다는 것을 의미하지는 않습니다. – ChaosPandion

+1

C에서 C를 작성하려고하지 않고 있습니다. C에서 어떻게해야 할지를 말한 것입니다. 그래서 내가해야 할 일을 물었습니다. –

답변

4
public class StructData 
{ 
    public long type; 
    public long[] myArray = new long[50]; 
    public string text; 
} 

StructData[] datas = new StructData[100]; 

for (int i = 0; i < datas.Length; i++) 
{ 
    datas[i] = new StructData(); 
} 

사용 클래스 (구조체가 작고 불변해야한다고 말할 수 있습니다. 그들은 그러나 당신이 원하는 일 수있다), 가장 큰 구조체 내가 아는 명확하게하기 위해 을 .NET에서 4 int로 구성됩니다 (GUID). 나는 이것이 큰 구조물에 비해 작은 것에 대한 좋은 기준이라고 생각합니다.

컬렉션을 확장해야하는 경우 목록을 사용하고, 크기가 고정되어 있으면 배열을 사용하고 목록은 배열보다 훨씬 느리지 않습니다. 내부적으로 배열을 사용합니다. 아무도리스트에 대한 벤치마킹을 벤치마킹 한 적이 있는지 모르겠습니다. List는 일반적으로 배열보다 조금 더 많은 메모리를 사용합니다. 컬렉션을 확장하는 데 필요한 공간이 작기 때문에 List의 현재 크기와 내부 배열에 대한 포인터 및 기타 데이터를 유지합니다. int 및 포인터, 모든 객체의 std 오버 헤드). 예약 할 요소의 수를 생성자에 전달하여 List를 "미리 설정"할 수 있습니다.

+0

Dang, 너는 나를 때렸다! – CodingGorilla

+0

배열에 쓸 때 오류가 발생합니다. 나는이 줄을 사용했다 : datas [0] .type = 123; –

+0

@ 닉 어떤 오류가 발생합니까? 코드를 테스트했는데 괜찮습니다. – xanatos

0

네이티브 상호 운용성이 필요하다면, 즉 몇 가지 메커니즘을 통해 이러한 유형을 마샬링하거나 바이트 배열을 중심으로 캐스팅 할 경우이 안전하지 않은/고정 된 항목이 필요하며 이렇게 할 수 있습니다.

unsafe struct structData 
{  
    int type; 
    fixed int myArray[50]; // long is 64-bit in C# was that intentional? 
    string text; // string is a managed type 
} 

C에서 오는 것은별로 의미가 없으므로 C 코드를 C#으로 직접 변환하면 안됩니다. C#에서는 일들이 관리되고 일반적으로 관리되는 코드와 관련된 비용을 수락하고 처음에는 어쨌든 그 수준에서의 성능 영향을 생각하지 않습니다.

시작하기에 좋은 곳은 값 유형과 참조 유형간에 미묘하지만 중요한 차이점을 많이 설명하기 때문에 C#의 메모리 모델을 연구하는 것이 좋습니다.

2

그래서 먼저 C에서 C 코드를 작성해야한다는 유혹을 피해야한다고 가정 해 보겠습니다. 명백한 구문 상 유사점을 제외하고 두 언어는 공통점이 거의 없습니다.

C#에서는 구조체를 거의 사용하지 않습니다. 구조체의 의미는 클래스의 의미와 다릅니다. 다음은 클래스를 사용할 때 struct v를 사용하는 경우에 대한 간략한 요약입니다. 사용할 수있는 리소스가 더 많습니다. 주제에 치고 합리적인 것으로 보이는 첫 번째 결과를 얻었습니다. When to use a struct

두 번째로 가능한 경우 일반 컨테이너 유형을 사용해야합니다. 성능은 문제가되지 않으며 장기적으로 당신의 삶을 훨씬 쉽게 만들어줍니다. 배열 선언에 대한 구문은 꺼져 (이것은 C보다 다르다)과 같아야합니다

long[] myArray = new long[50]; 

당신이 fixed 키워드를 통해이 작업을 수행 할 수있는 상호 운용성을 위해 메모리에 고정되는 배열을해야하는 경우,하지만 상호 운용성 계층은 관리되는 배열을 네이티브 함수에 전달할 때 실제로이 작업을 수행합니다.

C#을 처음부터 배우고 구문이 C와 비슷하다는 사실을 잊어 버리는 것이 좋습니다. 완전히 다른 의미와 모범 사례가있는 완전히 다른 언어입니다.