2011-04-21 3 views
1

내가 뭔가를 발견했을 때 나는 그 논리를 전혀 보지 못했다. 다음 코드로 오크를 보자 :로컬 변수처럼 작동하는 각 변수에 대해?

For Each ds As DerivedScale In List 
    If ds.ScaleID = scaleId Then 
     ds.ScaleID = ds.ScaleID + scaleStep 
     CType(List(myCounter + scaleStep), DerivedScale).ScaleID = scaleId 
     myDerivedScale = ds 
     ds = List(myCounter + scaleStep)   <--------------------- 
     List(myCounter + scaleStep) = myDerivedScale 
     Exit For 
    End If 
    myCounter += 1 
Next 

이 부분은 장소를 변경하고 일련 번호 (scaleid)를 변경하기 위해 2 레코드로 작성되었습니다. 화살표는 문제가 발생한 위치를 나타냅니다. 항목 "ds"는 오브젝트 1의 색인 수 위/아래로 대체됩니다. 그러나 목록에있는 개체에는 영향을주지 않습니다. 그래서 내가 체크 할 때, 아이템 ds가 설정되지 않았다.

그러나 ds.ScaleId = ds.ScaleID + scaleStep을 보면이 값이 목록에 반영됩니다.

그래서 내가 궁금해하는 것은 "ds"는 로컬 변수처럼 작동하며 속성을 변경 만 할 수 있습니까?

미리 감사드립니다.

답변

2

ds는 목록에서 참조하는 개체에 대한 참조입니다. 따라서 속성을 설정하면 해당 변경 사항도 목록에 반영됩니다. 하지만 ds는 단지 참조 일 뿐이므로 추측 할 때 ds가 언급 한 내용을 변경해도 목록에 영향을 미치지 않습니다.

0

.Net의 개체는 참조로 전달됩니다.

목록에 DerivedScale 인스턴스가 하나 있습니다. For Each 루프는 목록에있는 동일한 인스턴스를 반복합니다.
복사본이 만들어지지 않습니다. 당신은 객체 자체를 수정하고 있습니다.

0

변수의 선언 범위가 루프로 지정됩니다. ds 및 목록에 개체 참조가 있기 때문에 ds를 다시 할당해도 목록이 변경되지 않고 목록에 영향을 미치지 않고 ds가 참조하는 항목 만 변경하기 만하면됩니다.

1

열거 자 대신 색인을 사용하여 목록을 반복해야합니다 (여기서 참조하는 것은 모두 참조). 그런 다음 개체를 인덱스로 교체하고 속성을 변경할 수 있습니다.

관련 문제