문제

코딩 벤처에서 C ++와 vb.net을 마이그레이션합니다. 이는 무언가가 가치에 의한 것인지 또는 VB.NET에서 참조 할 때 때때로 혼란을 초래합니다.

예를 들어, 많은 객체로 채워진 MyObject 배열이 있다고 가정 해 봅시다.

dim MyArr(5000) of MyObject

이제이 배열의 정보가 다양한 데이터 구조를 통해 이동한다고 가정 해 봅시다.

dim MyList as new List(of MyObject)
for i as integer = 0 to 5000 step 1000
  Mylist.add(MyArr(i))
next

그 다음에

dim MyTable as new HashTable
dim i as integer = 0
for each O as MyObject in Mylist
  if i mod 2 = 0 then
     MyTable.add(O.ToString(), O)
  end if
next

위의 시나리오에서는 모든 것이 참조적이라고 생각합니다. "MyTable"에서 항목을 추출하고 MyObject 멤버를 수정하면 MyARR의 원본이 수정 될 것이라고 생각합니다.

그러나 나는 무언가가 참조로 생각했다고 생각한 상황에 빠졌고, 그것은 가치에 의한 것입니다.

품목은 항상 참조로 컨테이너에 추가됩니까, 아니면 때로는 값으로 추가됩니까?

나는 혼란 스럽다.

도움이 되었습니까?

해결책

"참조로"또는 "가치 별"의 경우가 아닙니다. ADD 메소드에 전달하는 값이 복사됩니다. 그러나 값은 a입니다 참조 객체에 - 그리고 다른 참조를 통해 해당 객체를 조작하면 해당 변경 사항을 볼 수 있지만 객체에 도달 할 수 있습니다.

데이터 자체의 독립적 인 사본을 본 적이 있다면 값 유형을 사용하고 있음을 암시하지만 ... 변화, 그것은 당신이 a를 사용하고 있음을 암시합니다 변하기 쉬운 가치 유형, 이것은 나쁜 생각입니다. 가치 유형은 거의 항상 불변이어야합니다. 그렇지 않으면 많은 혼란을 초래합니다. (참조 유형도 불변 할 수 있습니다 - 문자열은 좋은 예입니다.)

참조 유형 및 가치 유형에 대한 자세한 내용은 내 기사를 참조하십시오. 참조 그리고 매개 변수. 그들은 C# 관점에서 작성되었지만 기초는 VB에도 적용됩니다.

일단 값 유형 값과 기준의 차이점을 이해하면 컬렉션이 더 의미가 있습니다.

다른 팁

이 규칙을 사용할 수 있습니다. NULL을 객체에 할당 할 수 있으면 참조로 전달됩니다. 그렇지 않으면 가치가 전달됩니다.

이 규칙에 대한 예외는 무효 유형과 구조입니다. 그들은 항상 가치로 통과됩니다.

나는 그것이 항목의 유형에 달려 있다고 생각합니다. 컬렉션이 아닙니다.

예 :

int [] ints = new int [10];

ints [0] = 1; //-)

이 경우 1은 valueType 인 한 복사됩니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top