目次
1. string と stringbuilder は参照型ですか、それとも値型ですか?
1. string と stringbuilder は参照型ですか、それとも値型ですか?
MSDN では、String と StringBuilder は両方とも参照型であると公式に述べています。
参照型: 参照はスタック メモリを割り当て、参照型自体のデータはヒープに格納されます。
値の型:関数内で作成、スタックメモリ、クラス内のメンバ変数のヒープ型。
理論的な観点から見ると、String クラスは Object クラスから継承され、StringBuilder クラスは AbstractStringBuilder クラスから継承され、さらに AbstractStringBuilder クラスは Object クラスから継承され、どちらも Object クラスから派生します。String クラスは不変クラスです。割り当てられるのは 1 回だけです。内容が変更されると、新しいオブジェクトが生成されます。新しいオブジェクトが生成されるたびに、システムのパフォーマンスに影響があり、 の効率が低下します。ネットコンパイラ。StringBuilderクラスは変数クラスです。各操作は新しいオブジェクトを生成するのではなく、独自のオブジェクトに対して動作します。コンテンツの増加に応じて占有領域が拡大します。そのため、大量の変更操作を実行する場合、StringBuilderクラスは生成されません。多数の匿名オブジェクトがシステムのパフォーマンスに影響を与えるためです。
2: 文字列を使用して文字列を接続します
たとえば、文字列 string str="my" をインスタンス化する場合、str オブジェクトのメモリ アドレスはヒープ内の my を指します。str+="name" が使用される場合、my の値は変更されませんが、新しいセクションが作成されます。ヒープに割り当てられます。メモリ空間「myname」は str に参照されます。本質は、新しい文字列を作成して str に割り当てることです。ループ内で複数の文字列変更操作を実行すると、大量のガベージ メモリが生成されることを想像してみてください。StringBuilder は、インスタンス化中、または Capacity が十分に拡張されていない場合にのみメモリを割り当てます。
3.文字列ビルダー
StringBuilder は char* a = new char[lenth]; と同等です。
ヒープ メモリの一部は、文字列データを保存するために特別に開かれます。
StringBuilder はオブジェクトの作成時にメモリ サイズを指定できます。
StringBuilder mStringBuilder = new StringBuilder("LittlePreilla",30);
メモリが超過すると、StringBuilder はメモリを自動的に 2 倍にします。
mStringBuilder.Capacity = 10; //设置内存
mStringBuilder.EnsureCapacity(10); //检查内存,大于10不变,小于10改为10
4.StringBuilderの使い方
1) スプライシング
mStringBuilder.Append("aaa");
mStringBuilder.AppendFormat("aaa{0:D}",1012);
2)インサート
mStringBuilder.Insert(1,"ddd"); //index下表位置
3)削除
mStringBuilder.Remove(1,2); //index下表位置开始,移除几位
4) 交換
mStringBuilder.Replace("aaa","bbb");
私は個人的に、出力のフォーマットに正規表現を使用することを好みます。これも非常に便利です。
int a = 10;
string str = $"aaa{10}bbbb";
//结果为 aaa10bbbb