質問: 0;i<100;i++){ // aaaを使った処理 } ``` このほうがいいでしょうか?
回答: こんにちは。 この質問にはいくつかポイントがあるので、分けて回答します。 まずは`string`型を使っている質問のコード例について回答します。 C#の中で`string`型は少し特殊な存在で、一般的なクラスとメモリの扱い方に違いがあります。 質問のコードの場合であれば、「上と下、どちらで書いてもメモリ使用量には影響しない」と断言できます。 次に、一般的なクラスをnewした場合について。 C#はガベージコレクションを採用している言語であり、基本的にコード上で「メモリの解放を直接指示することはない」ということは理解していますか? 「forループの中でnewする度にメモリが増える」は半分正しいですが、その後ろに「1ループする度に、newしたクラスは自動解放待ちになるので気にする必要はない」と付きます。もちろんどこかに参照を保持していないことが前提ですが。 結論としては、「一時的にメモリ使用量が増えているように見えますが、大半は解放待ち状態に入っているので気にする必要はない」です。質問にあるような、「一つのインスタンスを最初に宣言して使い回す」というのは新しいメモリを確保しない分は多少メモリにやさしいですが、バグが潜みやすいコーディングスタイルなのであんまりオススメできません。本当にメモリを注視しなければならない場面でのみ検討するべきです。そんな場面になったらむしろ`unsafe`が視野に入るレベルですが...... 最後に、`using`、`Dispose()`について、多少勘違いがあります。 この2つは、IDisposableインターフェイスに関わる構文です。このインターフェイスは「インスタンスを使用しなくなった時、明示的に終了処理ができる」ことを表すものです。よって、これはメモリの解放と直接の関係はありません。どのようなクラスであっても、そのスコープ外に出てしまえば、そのまま放置することでGCによって自動でメモリが解放されていきます。 しかし、IDisposableは特にメモリと深く関連付けられて話題にされることが多いです。IDisposableが重要な理由は、「C#ではGCによってメモリが解放されるが、"何時"解放されるかはわからない」という点です。例えば、何かファイルをオープンした時などは、使い終わって放置すれば"何時かは"解放される、と言うのが良くない理由はわかっていると思います。よって、そういう場合に明示的に終了処理を呼び出すためにあるのがIDisposableなのです。 結論としては、「IDisposableが実装されたクラスは必ず使用後にDisposeする、またはusingで使う」「IDisposableが実装されていないクラスはなにも気にせず使う」って感じで大丈夫です。