2011-11-18 15 views
6

Jako .NET nie używa stylu C null s, aby zakończyć ciąg znaków, w jaki sposób zachować przydzielony ciąg, ale zmienić jego długość, używając niebezpiecznego kodu?Niebezpieczny kod do zmiany długości (przez mutację!) Obiektu typu String?

Jak rozumiem .NET przy użyciu nagłówka 20 bajtów dla każdego ciągu, prawdopodobnie jest to gdzie długość ciąg jest przechowywany, czy istnieje, aby bezpośrednio zmodyfikować tę długość? Więc .NET będzie przechowywać ciąg w pamięci, ale kiedy zadzwonię pod numer .Length, zwróci on .Length Chcę.

jeśli to możliwe, także byłoby interesujące usłyszeć wszystkie szalone możliwych skutków ubocznych tego

UPDATE

próbuję to osiągnąć bez używania refleksji.

+2

Należy zauważyć, że ciągi .NET są zakończony zerem. – SLaks

+1

Do czego to jest potrzebne? – Jacob

+0

@jacob jakiś zły eksperyment o zarządzaniu pamięcią :) Próbując przydzielić jedną dużą porcję pamięci i używać jej wielokrotnie, aby uniknąć fragmentacji LOH. –

Odpowiedz

4

Od 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

Należy zauważyć, że klasa ciągów zmieniła się zasadniczo w .Net 4; teraz ma tylko dwa pola. – SLaks

+0

Wow, dokładnie to czego szukałem, przetestuję to teraz –

+0

Czy jest jakiś artykuł dotyczący aktualizacji .NET 4.0 związanych z aktualizacjami "System.String'? –

0

Możesz użyć Odbicie, aby ustawić pole m_StringLength.

+0

Przepraszam, zapomniałem powiedzieć, że próbuję tego niebezpiecznego kodu bezpośrednio, a nie z refleksji, zaktualizowałem pytanie. –

Powiązane problemy