2012-02-27 4 views
2

나는 적이라고 불리는 직사각형 목록을 정의했으며, 목록에서 직사각형을 통과하고 X 값을 감소 시키려고하는데 오류가 발생합니다. "수정할 수 없습니다. foreach 반복 변수이기 때문에. " 이 문제가 무엇인지, 그리고 올바른 방법이 있는지 궁금합니다.foreach 루프 내에서 객체의 값 수정

 foreach (Rectangle i in enemies) 
     { 

      i.X --: 

     } 
+3

악의적 인 변경 가능한 구조체를 사용하고있는 것 같습니다. 하지마. – SLaks

+4

원수가되는 직사각형에 대해 가지고있는 점은 무엇입니까? :/요점은 System.Drawing.Rectangle 구조체입니까, 아니면 자신의 구조체입니까? _____? –

+0

WPF Rectangle 클래스와 달리 XNA'Rectange' (Struct입니다)를 참조 했으므로 xna를 태그로 추가했습니다. –

답변

8

값 유형은 값에 의해 을 복사; 그것이 바로 "가치 유형"이라고 불리는 이유입니다. 이렇게하면 사각형의 복사본을 만든 다음 복사본을 돌연변이시킵니다. 자, foreach 루프가 불변의 복사본을 만들어 버리고 바꿀 수 없다는 것을 알려줍니다. 버그를 막 잡았 기 때문에 좋습니다. 변경 가능한 복사본으로 변경 한 경우 오랫동안 버그를 발견하지 못했을 수 있습니다.

귀하의 적 유형은 값 유형이 아닌 참조 유형이어야합니다. 적 이 포함되어 있지 않습니까? 이 아닌 사각형이입니다. 그런 다음 적을 참조하여 사각형을 변형 할 수 있습니다.

+1

적 (Enemy)이 참조 형식이어야한다고 동의하는 동안 XNA에 대해서는 한 가지주의 할 점이 있습니다. Xbox 360에서 실행하려는 경우 가비지 수집기가 큰 문제이므로 변경할 수있는 구조체가 다소 일반적입니다 그곳에. 많은 적 (예 : 기하학 전쟁)을 사용하여 게임을 만들려고하면 성능 문제가 될 수 있습니다 (객체 풀링이 가변 구조체보다 훨씬 더 합리적이라고 가정 할지라도). –

+1

@MichaelStum : 원래 포스터가 XNA를 사용하고 있었기 때문에 태그를 추가했음을 기억하십시오. XNA Rectangle이 구조체이기 때문에 의미가 있지만 여전히 OP가 다른 구조체 Rectangle을 사용하고 있었을 가능성이 아주 적은가? 어쩌면 ... –

+0

아니, 당신은 그것이 XNA 였다는 가정하에 정확했다. 도움에 대한 모든 감사, 나는 최근에 그것을 사용하기 시작했다. – Sam