2010-07-21 2 views
37

저는 C#의 시작과 관련된 질문이 있습니다. GameObject이라는 클래스가 있다고 가정하고 GameObject 엔티티 배열을 만들고 싶습니다.C#에서 객체의 배열을 선언하는 방법

컴파일러는 (구문이 올바르지 않아서) 불만을 토로합니다.

houses[0].Model = Content.Load<Model>("Models\\Building_01 Windowed"); 

houses[0]GameObject해야하며, 다음과 같이로드 할 수있는,하지만 컴파일러는이 오류가 발생합니다 :이 XNA 개발이기 때문에, 다음과 같이 나는 LoadContent() 방법에 내 텍스처를로드

"Use the "new" keyword to create an object instance"

"Check to determine if the object is null before calling the method"

내 초기화에 문제가있을 것입니다.

+3

간격과는 별도로 아무 문제가 없습니다. 구체적인 오류를 알려주십시오. – Noldorin

+4

컴파일러는 ** 잘못된 ** 것을 말하지 않았습니다 **. 컴파일러가 특정 오류 메시지 또는 메시지를 제공했습니다. 세부 사항을 포함하도록 질문을 편집하십시오. –

+2

글쎄 * * 뭔가를 수정 * 다음 컴파일러의 마음을 읽을 수 없다. 그러한 질문에 대해 가능한 답을 어떻게 기대할 수 있습니까? –

답변

45

여기의 문제는 배열을 초기화했지만 요소는이 아닙니다. 그들은 모두 null입니다. 따라서 houses[0]을 참조하면 null이됩니다.

T[] InitializeArray<T>(int length) where T : new() 
{ 
    T[] array = new T[length]; 
    for (int i = 0; i < length; ++i) 
    { 
     array[i] = new T(); 
    } 

    return array; 
} 

이 그런 다음 귀하의 houses 배열을 초기화 할 수 있습니다 : 여기

당신이 자신을 위해 쓸 수있는 좋은 작은 도우미 메서드의 이런 일이

GameObject[] houses = InitializeArray<GameObject>(200); 
+1

아주 좋은 도우미, 고마워, 댄. 배열을 만들 때 일종의 briandeaded입니다. 그러나 나는 아직도 그런 현대 languges의 컴파일러가 더 똑똑해야한다고 느낍니다. – Kevin

+6

@ 로버트 : 항상 모든 개체를 초기화하고 싶지는 않습니다. –

0

당신이 가진 모든 것이 멋지게 보입니다.

내가 제공 할 수있는 오류 메시지가 표시되지 않고 생각할 수있는 유일한 점은 GameObject에 기본 (매개 변수 없음) 생성자가 필요하다는 것입니다.

+0

그 배열을 만들 때 오류 메시지가 발생해서는 안됩니다 ... – thecoop

+1

간단한 배열을 선언하기 위해 매개 변수없는 생성자가 필요하지 않습니다. 실제 인스턴스로 초기화하지는 않지만 null로 설정합니다. – drharris

+0

D' oh! 나는 C# & C++을 다시 혼란스럽게합니다 ... –

8

널 참조 배열을 작성 중입니다. 당신은 다음과 같이해야합니다 :

for (int i = 0; i < houses.Count; i++) 
{ 
    houses[i] = new GameObject(); 
} 
+0

'houses.Count' 대신'houses.Length'가되어야합니다. –

+2

죄송합니다. 배열을 사용하지 않습니다 - 왜 그러시겠습니까? 나는 어떤 종류의 컬렉션을 사용합니다. 컬렉션에는 Count 속성이 있습니다. –

+0

배열은 어떤 상황에서는 더 빠를 것이기 때문에. –

1

나는 GameObject을 참조 유형이라고 생각합니다. 참조 유형의 기본값은 null => 이며 배열은 널입니다.

배열의 각 구성원을 분리하여 초기화해야합니다.

houses[0] = new GameObject(..); 

그런 다음에 만 컴파일 오류없이 개체에 액세스 할 수 있습니다.

그래서 당신은 명시 적으로 배열 initalize 수 있습니다

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

을하거나 값 유형에 GameObject을 변경할 수 있습니다.

+0

당신은 그가 집 배열을 처음부터 선언하는 방법을 아직 증명하지 않았습니다. – David

0

이유 배열을 초기화하는 않기 때문에이다 해당 배열의 각 요소를 초기화하지 않습니다. 먼저 houses[0] = new GameObject()을 설정해야 작동 할 수 있습니다.

+0

그는 아직도 그가 할 수 없었던 집 배열을 먼저 만들어야한다는 것을 제외하고는. – David

6

LINQ을 사용하면 초기화되지 않은 요소의 배열을 한 줄의 코드로 생성 된 새 개체 모음으로 변형 할 수 있습니다.

var houses = new GameObject[200].Select(h => new GameObject()).ToArray(); 

사실, 당신이 다른 어떤 소스, 정수도 generated sequence을 사용할 수 있습니다 : 원래 시퀀스의 종류는 중요하지 않지만

var houses = Enumerable.Repeat(0, 200).Select(h => new GameObject()).ToArray(); 

그러나, 첫 번째 경우는, 나에게 더 읽기 보인다 .

+2

필자는 실제로 두 번째 사례가 훨씬 더 읽기 쉽고 분명하다고 생각합니다. 첫 번째 예제에서는 원래 시퀀스의 유형이 중요하지 않으므로이를 읽는 사람에게는 매우 혼란 스럽습니다. Enumable.Repeat는 성능 중요한 코드를 작성하는 경우 성능에 영향을 미칠 수 있습니다. 당신이 아니라면 나는 이것이 훌륭한 해결책이라고 생각한다. – Rocklan

+0

좋은 지적입니다! 두 번째 경우는 설명대로 정확하지만 처음에는 선의 목적을 처음부터 "추측"할 수 있습니다. – Eugene

0

배열의 객체 요소를 초기화해야합니다. 물론

GameObject[] houses = new GameObject[200]; 

for (int i=0;`i<house` i<houses.length; i++) 
{ houses[i] = new GameObject();} 

당신은 당신이 그 (것)들을 참조하기 전에 요소를 선택적으로 다른 곳에서는 다른 생성자를 사용하여 초기화합니다.

관련 문제