valores pasar parametros otro objetos objeto copiar como clonar c# reference copy equals-operator

c# - pasar - copiar valores de un objeto a otro java



¿Cuándo se copia un objeto/valor de C#y cuándo se copia su referencia? (3)

Sigo teniendo el mismo problema una y otra vez cuando se copia un objeto al que quiero hacer referencia o cuando se hace referencia a un objeto que quiero copiar. Esto sucede cuando uso el operador =.

Por ejemplo, si estoy enviando el objeto a otra forma, es decir:

SomeForm myForm = new SomeForm(); SomeObject myObject = new SomeObject(); myForm.formObject = myObject;

... y luego modificar el objeto en el formulario, el objeto original no se modifica. Es como si el objeto fuera copiado y no referenciado. Sin embargo, cuando hago esto:

SomeObject myObject = new SomeObject(); SomeObject anotherObject = new SomeObject(); anotherObject = myObject;

... y luego modificar otro anotherObject , mi objeto se modifica también.

El caso más agravante es cuando intento clonar uno de mis objetos definidos:

public class SomeObject { double value1, value2; //default constructor here public SomeObject(val1, val2) { value1 = val1; value2 = val2; } public void Clone(SomeObject thingToCopy) { this.value1 = thingToCopy.value1; this.value2 = thingToCopy.value2; } }

cuando hago esto ...

SomeObject obj1 = new SomeObject(1, 2); SomeObject obj2 = new SomeObject(); obj2.Clone(obj1);

... se hace referencia a obj2 y cualquier modificación a obj2 cambia a obj1 .

Los objetos del sistema, como int, double, string , etc., parecen estar siempre copiados, excepto en el caso del método de clonación anterior.

Mi pregunta es, no teniendo en cuenta el uso de la palabra clave ref en las funciones, cuándo se copia un objeto y cuándo se hace referencia a un objeto en cada caso de la materia (es decir, al pasar a las funciones, al establecer como otros objetos (como los dos primeros ejemplos anteriores), al copiar variables miembro como el tercer ejemplo, etc.)?


Con respecto a la clonación de sus objetos, si los valores que está copiando de un objeto a otro son tipos de referencia, cualquier modificación a esos valores en el objeto original afectará los valores en el objeto copiado (ya que son solo referencias al mismo objeto)

Si necesita clonar un objeto que tiene propiedades que son tipos de referencia, debe hacer que esos tipos sean clonables o hacer una copia manual de ellos mediante la instanciación de nuevas instancias según sea necesario.

Considere el uso de la interfaz IClonable , aunque no es la mejor solución.


Es difícil responder a este tipo de preguntas precisamente sin perder mucho tiempo escogiendo tus palabras con cuidado.

Lo he hecho en un par de artículos que pueden ser útiles:

Eso no quiere decir que los artículos sean perfectos, por supuesto, ni mucho menos, pero he tratado de ser lo más claro posible.

Creo que una cosa importante es separar los dos conceptos (paso de parámetros y tipos de valor de referencia vs. valor) en su cabeza.

Para ver sus ejemplos específicos:

SomeForm myForm = new SomeForm(); SomeObject myObject = new SomeObject(); myForm.formObject = myObject;

Esto significa que myForm.formObject y myForm.formObject refieren a la misma instancia de SomeObject , como dos personas que tienen SomeObject de papel separadas, y cada una tiene la misma dirección escrita en ellas. Si va a la dirección en una hoja de papel y pinta la casa de rojo, luego vaya a la dirección en la segunda hoja de papel, verá una casa roja.

No está claro a qué se refiere con "y luego modifique el objeto en el formulario" porque el tipo que ha proporcionado es inmutable. No hay forma de modificar el objeto en sí. Puede cambiar myForm.formObject para referirse a una instancia diferente de SomeObject , pero es como escribir una dirección en una hoja de papel y escribir una dirección diferente en ella. Eso no cambiará lo que está escrito en la otra hoja de papel.

Si pudiera proporcionar un programa corto pero completo cuyo comportamiento no comprende (idealmente una aplicación de consola, solo para mantener las cosas más cortas y simples) sería más fácil hablar de las cosas en términos concretos.


Hola, Mike Todos los objetos, que se derivan de ValueType, como struct u otros tipos primitivos son tipos de valor. Eso significa que se copian siempre que los asigna a una variable o los pasa como un parámetro de método. Otros tipos son tipos de referencia, lo que significa que, cuando asigna un tipo de referencia a una variable, no su valor, sino su dirección en el espacio de memoria se asigna a la variable. También debe tener en cuenta que puede pasar un tipo de valor como referencia usando la palabra clave ref. Aquí está la sintaxis

public void MyMethod(ref int a) { a = 25 } int i = 20; MyMethod(ref i); //Now i get''s updated to 25.

Espero eso ayude :)