2011-11-18 6 views
6

.NETはCスタイルnullを使用して文字列を終了します。どのようにして割り当てられた文字列を保持できますか?安全でないコードを使用して長さを変更できますか?Stringオブジェクトの長さを変更するための安全でないコード(突然変異!)

すべての文字列に20バイトのヘッダーを使用して.NETを理解しているので、おそらくこれは文字列の長さが格納されている場所です。この長さを直接変更するにはどうしますか? .NETは文字列をメモリに保持しますが、.Lengthを呼び出すと、.Lengthが返されます。これが可能であれば

、また、私がリフレクションを使用せずにこれを実現しようとしている。この

UPDATE

のすべての狂気の可能な副作用を聞くために興味深いものになるだろう。

+2

。 – SLaks

+1

これは何のために必要なのですか? – Jacob

+0

@jacobメモリ管理に関するいくつかの悪い実験:) LOHの断片化を避けるために、1つの大きなチャンクを割り当てて、それを絶えず再利用しようとしています。 –

答えて

4

ネット文字列はnull終端されることに注意してください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

.Net 4では文字列クラスが大幅に変更されています。現在は2つのフィールドしかありません。 – SLaks

+0

うわー、まさに私が探していたものだから、今テストしよう。 –

+0

'System.String'アップデートに関連した.NET 4.0アップデートの記事はありますか? –

0

Reflectionを使用してm_StringLengthフィールドを設定することができます。

+0

申し訳ありません。この安全でないコードに直接挑戦しており、リフレクションではなく、質問を更新しました。 –