2011-11-30 3 views
4

요즘 나는 Rectangle 변수를 과 함께 사용할 때마다 ... 문을 사용하여 어떤 이유로 든 작동하지 않는다는 것을 알게되었습니다. 예를 들어문과 사각형이 완벽하게 작동하지 않는 이유는 무엇입니까?

는 :

var bounds:=new Rectangle(0,0,0,0); 

with bounds do 
begin 
    X:=1; 
    Y:=2; 
    Width:=33; 
    Height:=44; 
end; 

경계 '값은 문으로하지 무슨 일을 제로 남아있다. 그러나 내가 다음과 같이한다면 그것은 훌륭하게 작동한다.

var bounds:=new Rectangle(0,0,0,0); 

bounds.X:=1; 
bounds.Y:=2; 
bounds.Width:=33; 
bounds.Height:=44; 

왜 그렇게할만한가요?

+4

값 유형이 참조 유형처럼 작동하지 않는다는 것을 발견하면 모든 .NET 프로그래머를위한 학습 곡선이됩니다. 복사본을 업데이트 중입니다. 컴파일러는 그것에 대해 경고하지 않는다. –

+0

@ digitalanalog 어떤 프리즘 버전을 사용하셨습니까? 나는 최근에 이것을 시도하고 작동합니다. –

+0

4.0.25 버전입니다. – ThN

답변

1

Hans Passant가 암시하려고 시도하는 것은 "with"문이 경계 복사본을 만들어 작동한다는 것입니다. 필자는이를 확인하기위한 충분한 정보가 없지만 Delphi의 할당 연산자는 참조로 작동하므로 암시 적으로 얕은 사본이 실제로 자주 발생하지는 않습니다.

그러나 "with"문은 의도적으로 특별한 종류의 변수 범위 지정을 만듭니다. 경계 안의 필드를 움켜 잡거나 포함 된 메소드에서 필드를 가져올 수도 있고, 이전의 닫히지 않은 "with"문에서 필드를 가져올 수도 있습니다. 자동 리팩터링은 with 문을 만질 수 없습니다. with 문이 작동하는 클래스에 필드를 추가하면 메서드를 중단 할 수 있습니다.

이 실제로 더 나은

var bounds := new Rectangle(0,0,0,0); 
bounds.x := 1; 
bounds.y := 2; 
bounds.width := 33; 
bounds.height := 44; 
myLongNamedComponent.anotherLongNamedChild.pedanticRectangle := bounds; 

TL로 기록

with myLongNamedComponent.anotherLongNamedChild.pedanticRectangle do 
begin 
    x:=1; 
    y:=2; 
    width:=33; 
    height:=44; 
end; 

을 고려 : DR; "with"문은 더 이상 좋은 코딩 방법으로 간주되지 않습니다.

+0

마지막 정보를 보내 주셔서 감사합니다. 귀하의 답변은 매우 유용합니다. 고맙습니다. – ThN