tipos de datos inmutables

Immutable Object
Immutable (inmutable): Es decir, una vez creado e inicializado el objeto, el valor de este tipo en memoria nunca cambiará, y cada cambio posterior generará un nuevo objeto.
Como tipo inmutable, la característica principal es: una vez creado, siempre que se modifique, se creará una nueva instancia de objeto en el montón administrado, y será adyacente a la instancia de objeto anterior, y se asignará en un bloque continuo. en el espacio de memoria del montón administrado.
Ejemplo 1:
string str="zhjajihfgm";
str.Substring(0, 6)
La cadena en C# es inmutable, Substring(0, 6) devuelve un nuevo valor de cadena y la cadena original en el dominio compartido es constante. Otro StringBuilder es mutable, por lo que se recomienda StringBuilder.
Ejemplo 2:
class Contact
{ public string Name { get; set; } public string Address { get; set; } public Contact(string contactName, string contactAddress) { Name = contactName; Address = contactAddress; } } var mutable = new Contact( "Er Mao", "Universidad de Tsinghua"); mutable.Name = "Da Mao";










mutable.Address = "Universidad de Pekín"
Instanciamos Contact y lo asignamos a mutable, y luego podemos modificar el valor del campo interno del objeto Contact, que ya no es el valor inicial y puede llamarse objeto mutable.
Los objetos mutables se comparten en concurrencia de subprocesos múltiples y existen algunos problemas. En subprocesos múltiples, cuando el subproceso A asigna un valor a Name = "Da Mao", los datos que otros subprocesos pueden leer son:
mutable.Name == "Da Mao",
mutable.Address == "Tsinghua";
obviamente, el los datos están completos No se puede garantizar la sexualidad, y también se denomina extracción de datos. Cambiamos el objeto mutable a inmutable de la siguiente manera:
public class Contact2
{ public string Name { get; private set; } public string Address { get; private set; } private Contact2(string contactName, string contactAddress) { Name = contactName; Address = contactAddress; } public static Contact2 CreateContact(string name, string address) { return new Contact2(name, address); } }












Cuando se usan, los campos Nombre y Dirección solo se pueden inicializar a través del constructor Contact2. Contact2 es un objeto inmutable en este momento, porque el objeto mismo es un todo inmutable. Al usar objetos inmutables, no tiene que preocuparse por la integridad de los datos, y también puede garantizar la seguridad de los datos y no serán modificados por otros subprocesos.

Los objetos inmutables son los siguientes:
cadena
ImmutableStack
ImmutableQueue
ImmutableList
ImmutableHashSet
ImmutableSortedSet
ImmutableDictionary
ImmutableSortedDictionary
se usa de la siguiente manera,
ImmutableStack a1 = ImmutableStack.Empty,
ImmutableStack a2 = a1.Push(10),
ImmutableStack a3 = a2.Push(20),
ImmutableStack a4 = a3 .Push( 30);
ImmutableStack iv3 = a4.Pop();
Una cosa a tener en cuenta al usar la colección de listas inmutables de red es que cuando empujamos el valor, es correcto reasignar el valor a la variable original, porque un nuevo objeto se generará después del empuje, el original a1 Solo el valor anterior:
ImmutableStack a1 = ImmutableStack.Empty;
a1.Push(10);//Incorrecto, a1 sigue siendo un valor vacío, el empuje generará una nueva pila.
a1 = a1.Push(10); //Necesita reasignar la nueva pila a un
objeto inmutable 1. Ventajas
Compartir colecciones es seguro y nunca cambia.
Al acceder a las colecciones, no es necesario bloquearlas (seguridad de subprocesos).
Modificar colecciones sí No te preocupes por la destrucción de colecciones antiguas.
Integridad de datos garantizada, seguridad
Objetos inmutables Desventajas
Cuando cada operación de objeto/colección devolverá un nuevo valor. El valor anterior se mantendrá durante un período de tiempo, lo que provocará una gran sobrecarga de memoria y también provocará una carga de recuperación en el GC, y el rendimiento es peor que el de la colección mutable (alrededor de 40 veces la diferencia).
Al igual que string y StringBuild, la colección inmutable provista por Net también agrega una API de operación por lotes para evitar la creación de una gran cantidad de objetos:
ImmutableList immutable = ImmutableList.Empty;
//Convertir a una colección que se puede operar en lotes
var immutable2 = inmutable. ToBuilder();
immutable2.Add("xx");
immutable2.Add("xxx");
//Volver a una colección inmutable
immutable = immutable2.ToImmutable();

Aquí hablamos principalmente de los principales escenarios de aplicación de colecciones inmutables, como tareas de descarga similares a Thunder, colecciones utilizadas para registrar operaciones mediante operaciones de deshacer, etc. En tales escenarios, el contenido de uno de los elementos generalmente no se edita y la frecuencia de los elementos operativos no es frecuente. Al mismo tiempo, también cumple con la seguridad de subprocesos múltiples para evitar que las operaciones de bloqueo afecten el rendimiento del programa.

Supongo que te gusta

Origin blog.csdn.net/qq_37619255/article/details/130058804
Recomendado
Clasificación