2011-11-18 7 views
6

Como .NET no utiliza el estilo C null s para finalizar una cadena, ¿cómo puedo conservar la cadena asignada pero cambiar la longitud de la misma utilizando un código inseguro?Código no seguro para cambiar la longitud (por mutación) de un objeto String

Según entiendo .NET usando un encabezado de 20 bytes para cada cadena, presumiblemente aquí es donde se almacena la longitud de la cadena, ¿hay alguna manera de modificar esta longitud directamente? Entonces, .NET mantendrá la cadena en la memoria, pero cuando llamo al .Length, devolveré el .Length que quiero.

si esto es posible, también sería interesante escuchar todos los posibles efectos secundarios de este loco

ACTUALIZACIÓN

que estoy tratando de lograr esto sin necesidad de utilizar la reflexión.

+2

Tenga en cuenta que las cadenas son .Net terminada en nulo. – SLaks

+1

¿Para qué necesitas hacer eso? – Jacob

+0

@jacob algún experimento malvado sobre la gestión de la memoria :) Intentando asignar un gran trozo de memoria y reutilizarlo constantemente sin evitar la fragmentación de LOH. –

Respuesta

4

De Strings UNDOCUMENTED

public static unsafe void SetLength(string s, int length) 
{ 
    fixed(char *p = s) 
    { 
     int *pi = (int *)p; 
     if (length<0 || length > pi[-2]) 
      throw(new ArgumentOutOfRangeException("length")); 
     pi[-1] = length; 
     p[length] = '\0'; 
    } 
} 
+2

Tenga en cuenta que la clase de cadena ha cambiado sustancialmente en .Net 4; ahora solo tiene dos campos. – SLaks

+0

Guau, exactamente lo que estaba buscando, voy a probar esto ahora –

+0

¿Hay algún artículo para las actualizaciones de .NET 4.0 relacionadas con las actualizaciones 'System.String'? –

0

Puede usar Reflection para establecer el campo m_StringLength.

+0

Lo siento, olvidé de decir que estoy tratando de este código inseguro directamente y no con reflexión, actualicé la pregunta. –

Cuestiones relacionadas