Pergunta

Eu migrar entre C ++ e VB.NET em meus empreendimentos de codificação ... o que leva à confusão ocasional sobre quando algo é por valor ou por referência no VB.NET.

Vamos dizer por exemplo que eu tenho uma série de MyObject que é preenchida com um monte de objetos.

dim MyArr(5000) of MyObject

Agora, vamos dizer que a informação a partir dessa matriz viaja por todo várias estruturas de dados:

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

então

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

De acordo com o cenário acima, eu acredito que tudo é por referência. Se eu extrair uma entrada de "MyTable" e modificar os seus membros myobject, eu acho que o original em myarr será modificado.

No entanto, eu tenho que correr em situações em que eu pensei que algo estava por referência, e foi por valor.

são itens sempre adicionadas a recipientes por referência, ou são por vezes adicionadas por valor?

Estou confuso.

Foi útil?

Solução

Não é um caso de "referência" ou "por valor" realmente. O valor que você passa para o método Add é copiado. No entanto, para tipos de referência que o valor é uma referência para um objeto -. E se você manipular esse objeto através de outras referências a ele, você vai ser capaz de ver essas mudanças, contudo, você chegar ao objeto

Se você já viu cópias independentes de dados em si, que sugere que você está usando um tipo de valor ... mas se você está fazendo altera , que sugere que você está usando um mutável tipo de valor, que é uma má idéia. Tipos de valor deve ser quase sempre imutável, caso contrário, leva a um monte de confusão. (Tipos de referência pode ser imutável também -. String é um exemplo bom)

Para saber mais sobre os tipos de referência e tipos de valor, ver meus artigos sobre referências e parâmetros . Eles são escritos de uma perspectiva de C #, mas os fundamentos se aplicam a VB também.

Eu acho que uma vez que você entender a distinção entre um valor tipo de valor e uma referência, coleções fará mais sentido para você.

Outras dicas

Você pode usar esta regra: se você pode atribuir nulo em objeto, em seguida, ele será passado por referência. Caso contrário, ele será passado por valor.

Exceção a esta regra são tipos anuláveis ??e estruturas. Eles são sempre passados ??por valor.

Eu acho que depende do tipo de itens. Não em coleções.

por exemplo:.

int [] = new ints int [10];

ints [0] = 1; // -)

Neste caso 1 serão copiados, desde que de ValueType.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top