decir que tengo una estructura de C#:¿Qué ocurre cuando se asigna una nueva estructura a la matriz en C#?
struct Foo{
int mA;
public int A {get {return mA;}}
int mB;
public int B {get {return mB;}}
public Foo(int a, int b)
{
mA = a;
mB = b;
}
}
Y luego creo y variedad de Foo:
Foo[] foos = new Foo[10];
lo que sucede cuando hago esto?
foos[1] = new Foo(20, 10);
Si Foo era una clase, el Foo [] sostendría un puntero a un objeto de Foo en el montón, y que el puntero se cambia al nuevo objeto de Foo (el anterior se dejó para el reciclaje).
Pero como las estructuras son tipos de valores, ¿el nuevo Foo (20, 10) sobrescribiría físicamente la misma ubicación de memoria que tenía anteriormente foos [1]?
Por lo que recuerdo, sí. Las estructuras son tipos de valores, así que en lugar de sobreescribir la referencia en foos [i] (como verías con una clase), estás sobreescribiendo la estructura completa en esa posición en la matriz. El recolector de basura no tendrá que limpiar la estructura ya que fue sobrescrita físicamente. Para probar, calcule el tamaño de una matriz de Foo cuando Foo se declare como 'struct' y cuando se declare como' clase', teóricamente, el tamaño debe ser 'nElements * IntPtr.Size' para las clases y' nElements * sizeof (Foo) 'para las estructuras; pero nunca lo intenté en C#, así que podría estar equivocado. –
Me gustaría que pudieras hacerlo de alguna manera para que el 'nuevo' en realidad anule un objeto Foo directamente, en lugar de crear y luego copiar. – SimpleVar
@Yorye Creo que sería casi lo mismo que el enunciado largo i = 1 + 2; El valor 3 se crea a partir de la expresión (1 + 2) y luego se copia en i. Entonces, realmente, no es diferente de cómo se comportan normalmente los lenguajes de estilo C. – CodeFusionMobile