Pregunta

Migro entre C ++ y VB.NET en mis empresas de codificación ... lo que lleva a la confusión ocasional sobre cuándo algo es por valor o por referencia en VB.NET.

Digamos, por ejemplo, que tengo una matriz de MyObject que se rellena con un montón de objetos.

dim MyArr(5000) of MyObject

Ahora digamos que la información de esta matriz viaja a través de varias estructuras de datos:

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

entonces

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

Bajo el escenario anterior, creo que todo es por referencia. Si extraigo una entrada de " MyTable " y modifique sus miembros de MyObject, creo que el original en MyArr se modificará.

Sin embargo, me he encontrado con situaciones en las que pensé que algo era por referencia, y era por valor.

¿Los elementos siempre se agregan a los contenedores por referencia, o a veces se agregan por valor?

Estoy confundido.

¿Fue útil?

Solución

No es un caso de " por referencia " o " por valor " De Verdad. Se copia el valor que se pasa al método Agregar. Sin embargo, para los tipos de referencia, ese valor es una referencia a un objeto, y si manipula ese objeto a través de otras referencias a él, podrá ver esos cambios como sea que llegue al objeto.

Si alguna vez ve copias independientes de los datos, eso sugiere que está usando un tipo de valor ... pero si está haciendo cambios , eso sugiere que está usando mutable tipo de valor, que es una mala idea. Los tipos de valor casi siempre deben ser inmutables, de lo contrario, genera mucha confusión. (Los tipos de referencia también pueden ser inmutables, la cadena es un buen ejemplo).

Para obtener más información sobre los tipos de referencia y los tipos de valor, consulte mis artículos en referencias y parámetros . Se escriben desde una perspectiva de C #, pero los fundamentos también se aplican a VB.

Creo que una vez que entiendas la distinción entre un valor de tipo de valor y una referencia, las colecciones tendrán más sentido para ti.

Otros consejos

Puede usar esta regla: si puede asignar nulo a un objeto, se pasará por referencia. De lo contrario, se pasará por valor.

La excepción a esta regla son los tipos y estructuras anulables. Siempre se pasan por valor.

Creo que depende del tipo de elementos. No en colecciones.

Por ejemplo:

int [] ints = new int [10];

ints [0] = 1; // -)

en este caso, 1 se copiará siempre que sea ValueType.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top