2009-03-22 4 views
2

일반 목록 <> 박스 값 유형은 알 수 없습니다. 왜 다음 코드 스 니펫에서 rects [1]은 Inflate 메서드의 영향을받지 않습니까?리스트 <Rectangle> - 권투가있는 것처럼 동작합니다.

권투가 없다면 나는 rect [1]을 작성하고 싶다. 나는 주석으로 표시된대로 3 줄의 코드를 작성해야한다. 누군가 설명해 주시겠습니까?

List<Rectangle> rects = new List<Rectangle>(); 

for (int i = 0; i < 5; i++) 
{ 
    rects.Add(new Rectangle(1, 1, 1, 1)); 
} 

foreach (Rectangle item in rects) 
{ 
    Console.WriteLine(item); 
} 

//Rectangle r = rects[1]; 
//r.Inflate(100, 100); 
//rects[1] = r; 

rects[1].Inflate(100, 100); 

foreach (Rectangle item in rects) 
{ 
    Console.WriteLine(item); 
} 
+0

어떤 언어입니까? – Svante

+0

이것은 C# 언어입니다. – pkolodziej

답변

8

복싱이 아닙니다. 단순히 사각형을 꺼내면 직사각형 복사본을 단독으로 조작하는 것입니다.

이것은 가변 값 유형 (구조체)을 갖는 부작용 중 하나입니다. 그리고 자신이 변경할 수있는 구조체를 작성하면 안되는 이유는 데이터를 잃어 버리기 쉽습니다.

미리 만들어진 사각형을 변경할 수 없으므로 복사해야 할 것 같습니다. 그것을 돌연변이 라. 다시 넣으십시오.

+0

스택 및 힙 요소의 위치 측면에서 어떤 점이 있는지 설명해 주시겠습니까? 나는 여전히 그것을 이해하는 데 문제가있다. – pkolodziej

+0

rects [1]의 값은 * 스택에 * 복사된다. 그런 다음이 * copy *에 Inflate가 호출되며 목록의 값은 영향을받지 않습니다. –

+0

* copy *를 정확히 사용하면 언제입니까? 내 말은 : rect [1]을 쓸 때. * copy *를 사용하면됩니다. 그렇다면 왜 rect [1] = new Rect (100,100)을 쓸 때 새로운 값은 스택의 * copy *가 아닌 힙의 값을 대체합니까? * 사본 *을 만드는 규칙은 무엇입니까? – pkolodziej

1

네, 그렇게하면 Rectangle의 값이 로컬 변수에 복사됩니다.

권투라고하지 않습니다. Rectangle은 값 유형이므로 정상 복사입니다.

1

Rectangle은 값 유형이므로 rects[1]을 호출하면 Rectangle 인스턴스가 인덱스 1에 복사됩니다. 이는 값 유형이 .NET에서 실제로 작동하는 방식입니다.

관련 문제