2011-11-18 12 views
6

Poiché .NET non utilizza lo stile C null s per terminare una stringa, come posso mantenere la stringa allocata, ma modificarne la lunghezza utilizzando codice non sicuro?Codice non sicuro per modificare la lunghezza (tramite la mutazione!) Di un oggetto String?

Come ho capito .NET utilizzando un'intestazione di 20 byte per ogni stringa, presumibilmente questo è dove viene memorizzata la lunghezza della stringa, c'è comunque la possibilità di modificare direttamente questa lunghezza? Quindi .NET manterrà la stringa in memoria ma quando chiamo .Length restituirà lo .Length che desidero.

se questo è possibile, anche sarebbe interessante ascoltare tutti pazzi possibili effetti collaterali di questo

UPDATE

sto provando raggiungere questo obiettivo senza l'utilizzo di riflessione.

+2

Nota che le stringhe sono .Net terminazione null. – SLaks

+1

Per cosa ti serve? – Jacob

+0

@jacob un pessimo esperimento sulla gestione della memoria :) Cercando di allocare una grande porzione di memoria e riutilizzarla costantemente senza evitare la frammentazione LOH. –

risposta

4

Da 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

Si noti che la classe della stringa è cambiata sostanzialmente in .Net 4; ora ha solo due campi. – SLaks

+0

Wow, esattamente quello che stavo cercando, lo verificherò ora –

+0

C'è qualche articolo in giro per gli aggiornamenti di .NET 4.0 relativi agli aggiornamenti di 'System.String'? –

0

È possibile utilizzare Reflection per impostare il campo m_StringLength.

+0

Mi dispiace dimenticarsi di dire che sto provando questo codice non sicuro direttamente e non con la riflessione, ho aggiornato la domanda. –

Problemi correlati