2011-08-27 4 views
2

.NET 코드를 살펴보면 Rectangle.Sizenew Size(Width, Height)을 반환합니다. Microsoft는 왜이 패턴을 선택 했습니까? 개인적으로, 나는 Size이 구조체 내에 저장되고, Rectangle.WidthSize.Width을 반환한다고 생각했을 것입니다. 이렇게하면 모든 속성 호출을 만들 때 새로운 구조가 생성되지 않습니다. 나는이 결정에 영향을 미치는 불변성의 일부 속성이 있다고 추측하지만, 나는 무엇을 확신 할 수 없다.모든 호출에서 Rectangle.Size가 새 인스턴스를 만드는 이유는 무엇입니까?

+0

이제는 너비 또는 높이를 호출 할 때마다 구조체 복사본이 생성됩니다. 이 복사본을 숨길 수는 없으며 속성이 인라인되지 못하게하는 MarshalByRefObject에서 파생 된 Rectangle을 가진 많은 클래스가 있습니다. 가장 자주 사용되는 속성은 무엇입니까? 말하기 어렵지만, Rectangle 메소드 자체는 크기를 절대로 사용하지 않습니다. –

+0

@ 한스 - 각 호출이 새 복사본을 생성하는 이유는 무엇입니까? 각 Rectangle은 내부 크기 구조 만 가질 수 있습니까? – dlras2

+0

내부 크기 필드가있는 사각형 유형이 있다고 가정합니다. 이제 Width 및 Height 속성 getter를 구현하는 방법에 대해 생각해보십시오. –

답변

4

Size은 구조체이므로 힙에 새로운 객체를 만드는 것과는 다릅니다. 귀하가하는 일은 무엇이든간에 Size 가치의 새로운 사본을 만듭니다.

솔직히 말해서 어떤면에서 큰 차이를 만들지는 알 수 없습니다. WidthHeight 속성이 Size이라는 것을 감안할 때, 내가 제안한대로 Size을 저장하면 페널티가 많이 발생하지 않는다는 것을 알 수 있습니다 ... 그러나 똑같이 Size의 생성자는 JIT가 Rectangle.Size 속성을 거의 정확히 동일한 기본 코드로 변환 할 수 있어야합니다.

그래서 나는 그것이 약간 이상한 결정에 동의하지만 나는 그것이 많은 사람을 다치게 할 것 같지 않습니다. 아마도 직렬화가 더 간단해질 수도 있습니다.

0

항상 실제 크기로 연결되는 링크를 변경하면 부작용이 생길 수 있습니다. 의도를 변경하려는 경우 조작하려는 오브젝트의 특성이나 getter 및 setter를 사용해야합니다. 레이아웃을 계산하는 등 다른 용도로 사용하려면 가장 적절한 솔루션입니다.

관련 문제