0

C# コンパイラが以下の 2 つのステートメントをどのように処理するかについて興味があります。

String text = "abcdefghijklmnopqrstuvwxyz";
text = text.Substring( 0, 15 );
text = text + "...";

対。

String text = "abcdefghijklmnopqrstuvwxyz";
text = text.Substring( 0, 15 ) + "...";

結果はもちろん同じですが、連結演算子は 2 番目のセットアップでコードをより適切に最適化しますか?

どちらの場合も、スタック上の文字列に 4 つの割り当てが発生しますか?それとも 2 番目のケースでは 3 つしか割り当てられませんか?

いくつかのコードを読んでいるときに私が持っていたランダムな質問です。

4

2 に答える 2

10

まず、文字列はそもそもスタックに割り当てられていません。文字列はヒープにあります。

次に、両方のケースで 4 つの割り当てがあります。どれが消えると思っていたのか気になります。

偶然にも、これは今週の私のブログのテーマです。このテーマについて知りたいと思っていた以上のことについては、この記事を参照してください。

于 2013-06-26T14:11:06.697 に答える
2

私はあなたのコードを取得し、単純なコンソール アプリケーションにコンパイルしました。次に、IL を調べました (ILSpy を使用)。デバッグ モードでもリリース モードでも、最適化は行われませんでした。

この場合、コードはおそらく十分に単純であるため、コンパイラは最適化を行いませんでした。ただし、より複雑なバージョンでは、異なる結果が生じる可能性があります。

また、2 つの例の違いはほとんどないことに注意してください。どちらの場合も、ランタイムは 4 つの異なる文字列オブジェクトを作成することになります。最初の例では、変数への代入は 2 回だけ行われますが、2 番目の例では、代入は 3 回行われます。ただし、関係なく、4 つの文字列が作成されます。それらは次のとおりです。

  • "abcdefghijklmnopqrstuvwxyz"
  • "abcdefghijklmno" (部分文字列から)
  • 「……」
  • "abcdefghijklmno..." (連結から)

どちらの場合も、最初の 3 つの文字列はすぐにガベージ コレクションの対象になります。コンパイラは、あなたが持っているものを改善するための重要な方法を見つけられなかったと思います.

于 2013-06-26T14:15:49.367 に答える