Conocemos el concepto de inmutabilidad, pero necesitamos conocer algunos tipos inmutables además de
¿Hay más?
A continuación se incluye una lista de tipos inmutables en la biblioteca de clases del marco. (¡Siéntete libre de expandirlo!)
System.…Byte y SByteInt16 y UInt16Int32 y UInt32Int64 y UInt64IntPtrSingleDoubleDecimalnew { ... } en C#, New With { ... } en VB.NET)enum , Enum )obj.PropertyChanged += callback , en realidad es la referencia obj.PropertyChanged la que se muta para apuntar a una instancia de delegado recién construida; la instancia de delegado original permanece sin cambios.)DateTime , TimeSpan (mencionado en esta respuesta ) y DateTimeOffsetDBNullGuidNullable<T>StringTuple<…> introducidos con .NET 4 (mencionados en esta respuesta )UriVersionVoidSystem.Linq.…Lookup<TKey, TElement>No estoy seguro de si está buscando tipos públicamente inmutables en .NET o tipos totalmente inmutables. Además, ¿quiere ocuparse solo de los tipos públicos en .NET? El problema más profundo es definir qué forma la inmutabilidad. ¿Una clase que solo tiene
public readonly int[] Numbers;lo hace inmutable? Los Números en sí no se pueden cambiar, pero su contenido sí. Entiendes la idea.
De todos modos, podría inspeccionarse a sí mismo programáticamente . Para verificaciones anidadas más profundas, necesitará recursividad (que no haré aquí)
Cargue todos los ensamblajes que desee verificar y haga algo como (no probado)
var immutables = AppDomain.CurrentDomain .GetAssemblies() .SelectMany(t => t.GetTypes()) .Where(t => t .GetProperties(your binding flags depending on your definition) .All(p => !p.CanWrite) && t .GetFields(your binding flags depending on your definition) .All(f => f.IsInitOnly) .ToList();Incluso esto no será suficiente para encontrar la inmutabilidad de los tipos de colección. Algunos de los tipos de colecciones inmutables (aunque no forman parte del núcleo .NET predeterminado) se pueden encontrar aquí: Colecciones inmutables
Algunos inmutables notables:
String , Tuple , tipos anónimostipos de colección inmutables como
ImmutableArray (versión preliminar)
Diccionario inmutable
ImmutableOrdenadoDiccionario
ImmutableHashSet
Lista inmutable
InmutableQueue
ImmutableSortedSet
Pila inmutable
TimeSpan , o familia tipográfica moderna Tuple . Tuple es inmutable porque se implementó para admitir lenguajes funcionales (F # fe) en .NET.
Por supuesto, puede hacer que sus propias clases y estructuras sean mutables o inmutables, como desee. Los tipos inmutables (también conocidos como objetos de valor) son útiles en la programación de subprocesos múltiples, la programación funcional, para borrar un código.
Para hacer que una clase o estructura sea inmutable, simplemente elimine todos los configuradores públicos/protegidos/internos; y declarar mejor todos los campos con la palabra clave de readonly .