.net - usar - ¿Es la cadena un tipo de valor o un tipo de referencia?
string c# ejemplos (8)
El tipo de cadena representa una secuencia de cero o más caracteres Unicode. string es un alias para String en .NET Framework.
Aunque string es un tipo de referencia, los operadores de igualdad (== y! =) Se definen para comparar los valores de los objetos de cadena, no de las referencias. Esto hace que las pruebas de igualdad de cadenas sean más intuitivas. Por ejemplo:
string a = "hello";
string b = "h";
// Append to contents of ''b''
b += "ello";
Console.WriteLine(a == b);
Console.WriteLine((object)a == (object)b);
Esto muestra "True" y luego "False" porque el contenido de las cadenas son equivalentes, pero a y b no se refieren a la misma instancia de cadena.
Las cadenas son inmutables: el contenido de un objeto de cadena no se puede cambiar después de que se crea el objeto, aunque la sintaxis hace que parezca que se puede hacer. Por ejemplo, cuando escribe este código, el compilador realmente crea un nuevo objeto de cadena para contener la nueva secuencia de caracteres, y ese nuevo objeto se asigna a b. La cadena "h" es elegible para la recolección de basura.
string b = "h";
b += "ello";
¿Es la cadena un tipo de valor o un tipo de referencia?
Simplemente no puedo encontrar una "buena" explicación para esto ...
En muchos idiomas, hay dos tipos generales de cosas: aquellas donde una ubicación de almacenamiento de un tipo definido realmente contendrá un objeto de ese tipo, y aquellas donde una ubicación de almacenamiento de un tipo definido mantendrá una referencia a un objeto de ese tipo que se almacena en otro lugar. También hay varios tipos de semántica que las cosas pueden ofrecer:
- Semántica de valores inmutables: las instancias de un tipo particular tienen alguna característica ("el valor") que forma la base de la identidad. Dos elementos cuyo valor es igual se pueden usar indistintamente, independientemente de dónde estén almacenados. El valor será constante mientras exista la instancia. Una variable de ese tipo puede cambiar su valor, pero solo al almacenar una instancia diferente en la variable.
- Semántica de referencia inmutable: en general, similar a la semántica de valores inmutables, excepto que dos instancias que se crearon en momentos diferentes se reportarán a sí mismas como instancias diferentes.
- Semántica del valor mutable: las instancias de un tipo particular tienen alguna característica o colección de características ("los valores") que forman la base de la identidad, pero esas características pueden cambiarse sin reemplazar la instancia completa. Cada instancia se almacena en precisamente una variable o campo; al copiar una variable o campo a otro, se copian todos los valores de una, la primera instancia a la segunda, pero las instancias permanecen separadas. Los cambios futuros en una instancia no afectarán a la otra.
- Semántica de referencia mutable: cada instancia es idéntica a sí misma, pero a ninguna otra entidad, y las instancias tienen uno o más valores que pueden modificarse dentro de las instancias existentes. Cualquier número de variables o campos puede contener una referencia a cualquier instancia. Copiar una variable de campo a otra simplemente hace que la segunda se refiera a la misma instancia que la primera. En consecuencia, cualquier cambio en la instancia referida por una de las variables afectará a la instancia a la que hace referencia la otra (es decir, la misma instancia).
En algunos lenguajes de programación como C ++, es posible para los tipos de referencia directa e indirecta implementar cualquiera de los cuatro tipos de semántica anteriores. En .net y C #, los tipos almacenados directamente con campos expuestos implementan siempre # 3, los tipos expuestos con campos expuestos siempre implementan el # 4, otros tipos de valores pueden implementar cualquiera de los anteriores, y otros tipos de referencia pueden implementar # 1, # 2, o # 4, pero no # 3, con una abstracción solo con un poco de fugas. Las cadenas implementan # 1.
La "explicación" fundamental se basa en "qué" realmente se almacena en la ubicación de memoria asignada cuando "declaras" la variable para la cosa. Si el valor real de la cosa se almacena en la ubicación de memoria referida por el nombre de la variable, entonces es un tipo de valor.
int x; // memory allocated to hold Value of x, default value assigned of zero
Si, otoh, la ranura de memoria asignada cuando "declara" la variable mantendrá solo alguna otra dirección de memoria donde se almacenará el valor real (o valores), entonces es un tipo de referencia.
MyClass x; // Memory allocated to hold an address,
// default address of null (0) assigned.
// NO MEMORY ALLOCATED for x itself
o, si la declaración incluye la inicialización,
MyClass x = new MyClass();
// Now, Memory slot (call it Addr1) is allocated to hold address of x,
// more memory (call it Addr2) is allocated to hold a new MyClass object.
// New MyClass object created, stored in memory Addr2 (on the Heap)
// Address of new object (Addr2) is stored in Addr1
para una cadena, la cadena se crea en el Heap, y su dirección va en la ranura de memoria asignada para la variable, por lo que es un tipo de referencia.
String es un tipo de referencia inmutable que tiene ciertas cualidades que le dan la apariencia ocasional de ser un tipo de valor
String es un tipo de referencia inmutable.
Consulte la publicación del blog Tipos inmutables: comprenda sus beneficios y utilícelos en la inmutabilidad.
Tal vez el artículo Strings en .NET y C # pueda ayudarte. Según este artículo, la cadena es un tipo de referencia.
Console.WriteLine(typeof(string).IsClass); // true
Es un tipo de referencia.
No puede ser un tipo de valor, ya que los tipos de valor necesitan un tamaño conocido para la pila, etc. Como tipo de referencia, el tamaño de la referencia se conoce de antemano, incluso si el tamaño de la cadena no lo es.
Se comporta como espera que se comporte un tipo de valor porque es inmutable; es decir, no * cambia una vez creado. Pero hay muchos otros tipos de referencia inmutables. Delegar instancias, por ejemplo.
* = excepto por dentro de StringBuilder
, pero nunca lo ves mientras hace esto ...