Saltar al contenido

Volviendo a las referencias de sólo lectura de las funciones en C#

La palabra clave ref indica a una función que el valor se pasa por referencia. Puede utilizarse en múltiples contextos. Por ejemplo, puede utilizarse en una firma de método y en una llamada a método para pasar un argumento a un método. O puede utilizarse en una firma de método para devolver un valor a la persona que lo llama por referencia, que es lo que se necesita en este momento. Esta palabra clave permite notificar al llamador que el objeto devuelto es inmutable, y que no es posible modificar el valor.

Echa un vistazo a este sencillo ejemplo antes de sumergirte en las estructuras de sólo lectura:

Volviendo a las referencias de sólo lectura de las funciones en C#
Volviendo a las referencias de sólo lectura de las funciones en C#
12345678910111213141516171819 usando System;namespace {publicclassSimpleRefReadonly{staticint[] a =newint[10]{1,2,3,4,5,6,7,8,9,10};staticrefintGetIndex(int index){returnref a[index];}publicstaticvoidMain(){ Consola. WriteLine(GetIndex(0)); Console.ReadKey();}}}

csharp

Este código tiene un conjunto estático de números enteros con un tamaño de 10. GetIndex, el método utilizado aquí, toma un índice como argumento y devuelve un elemento de la matriz, que es de sólo lectura. Si pasas un índice mayor que la longitud del array o menor que cero, obtendrás una excepción que indica que una excepción System.IndexOutOfRangeException se produjo durante el tiempo de ejecución.

Para un ejemplo más complejo, puedes construir una estructura que represente una escuela con salas que tengan nombres y tamaños. La estructura no debe permitir la modificación del tamaño de las habitaciones una vez que se inicializan.

123456789101112131415161718192021222324252627282930313233343536 usando el Sistema;namespace {publicstruct ClassRooms {publicClassRooms(string name,int size){Nombre = nombre; Tamaño = tamaño; _utilización actual = nulo;}Salas de Clase Privadas[] _utilización actual;Nombre de la cadena pública {get;set;} Tamaño de la cadena pública {get;set;} {get;set;}cadena de control público a la cadena(){devuelve $"{esto. Nombre} :: {esto. Tamaño}";}publicvoidSetRoom(ClassRooms[] classrooms)=[]; _currentUtilization = aulas;publicrefreadonlyClassRoomsGetutilization(int x){returnref _currentUtilization[x]; }}clase públicaRefReadonly{publicstaticvoidMain(){salones de clase =nuevosSalones de clase[]{nuevosSalones de clase("Matemáticas",20),nuevosSalones de clase("Biólogos",15)};varEscuela =nuevosSalones de clase(); Escuela. SetRoom(Habitaciones); Console.WriteLine(Escuela.Getutilization(1)); Console.WriteLine(Escuela.Getutilization(0)); Console.ReadKey();}}}

csharp

Al ejecutar el ejemplo, lo siguiente debería estar en la consola:

12Biologs :: 15Matemáticas :: 20

bash

Aquí tienes una estructura llamada ClassRooms que representa a la escuela. ¡Esta estructura no es de sólo lectura! Cada aula tiene un nombre y un tamaño que debe ser pasado al constructor. La función ToString() ha sido anulada para permitir que cada aula se imprima más bonita. La clave aquí es la siguiente función:

1234publicrefreadonlyClassRoomsGetutilization(int x){returnref _currentUtilization[x];}

csharp

Esta función devuelve una copia de sólo lectura de un aula específica sin modificaciones, y protege los valores originales asignados durante la inicialización. La función Main() es responsable de construir la escuela; primero se inicializa el conjunto de variables Rooms, luego la Escuela, que se compone de habitaciones. Finalmente la función Getutilization() permite recuperar una copia de sólo lectura de la clase dada.