Veamos una demostración de esto también, y luego lo diseccionamos.
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849utilizando Sistema;namespace{publicclassReferenceType{publicclassServer{tipo de cadena pública;publicint vCPU;publicdouble RAM;}publicstaticevitarinicializarServidor(categoría de cadena,Servidor s){if(categoría =="pequeño"){ s. type ="smallServer"; s.vCPU =1; s.RAM =2.0;}elseif(category =="medium"){ s.type ="mediumServer"; s.vCPU =2; s. RAM =4.0;}elseif(category =="big"){ s.type ="bigServer"; s.vCPU =8; s.RAM =16.0;}else{thrownewSystem. ArgumentoExcepción("La categoría no puede ser otra que: pequeño, mediano o grande");}}publicstaticvoidMain(){Servidor a =nuevoServidor();Servidor b =nuevoServidor();Servidor c =nuevoServidor();initializeServidor("pequeño", a);initializeServidor("mediano", b);initializeServidor("grande", c); Consola.WriteLine($"El servidor:{nombrede(a)}, es de tipo: {a.tipo}, vCPU: {a.vCPU} y RAM: {a.RAM} GB!"); Console.WriteLine($"El servidor:{nombre de(b)}, es de tipo: {b.tipo}, vCPU: {b.vCPU} y RAM: {b.RAM} GB!"); Console.WriteLine($"El servidor:{nombre de(c)}, es de tipo: {c.type}, vCPU: {c.vCPU} y RAM: {c.RAM} GB!"); Consola. ReadKey();}}
csharp
La salida se ve así:
123El servidor:a, es del tipo: smallServer, vCPU: 1 y RAM: 2 GB. El servidor b, es del tipo: mediumServer, vCPU: 2 y RAM: 4 GB. El servidor c, es del tipo: bigServer, vCPU: 8 y RAM: 16 GB. bashTenemos una clase que es de tipo de referencia. Esto es importante de notar porque la función llamada initializeServer, que es inicializarla , toma dos argumentos. El primero es de tipo valor, y el segundo es de tipo referencia, que es donde se pasa la clase. La función cambiará las propiedades públicas de la clase pasada por referencia en función de la categoría que pasemos. Si pasamos una categoría que no está implementada, se lanza un error con este mensaje:
1Sistema.ArgumentoExcepción: "La categoría no puede ser otra que: pequeña, mediana o grande"bash
¿Qué pasa entre bastidores? Las instancias de clase de servidor a, b y c son de tipo de referencia. Esto significa que cuando las pasamos a la función initializeServer, se pasan sus direcciones en lugar de la instancia con los datos. Cuando asignamos una variable de referencia a otra, no copiamos los datos. Simplemente decimos que la nueva variable también hace referencia a la dirección original. Esto significa que si tuviéramos que modificar cualquiera de ellas, el cambio se reflejaría en ambas, ya que apuntan a la misma ubicación en la memoria. Las variables de tipo de referencia se almacenan en un espacio designado en la memoria llamado heap. Como resultado, cuando una variable de este tipo ya no se utiliza en nuestra aplicación, está sujeta a ser liberada por el recolector de basura.
Una nota sobre stack vs. heap: Stack se utiliza para la asignación de memoria estática, mientras que heap se utiliza para la asignación de memoria dinámica. Ambas son útiles, pero tienen propósitos diferentes.