これまでで一番「情けなかったとき」はいつですか?

C#において、同じインスタンスを何度もnewしてよいでしょうか。
(インターネットで探したんですが、意外に見つからなかったもので質問させていただきました。)

例えば

A a = new A();
//なにかしら処理
a = new A();
//なにかしら処理
a = new A();
//なにかしら処理


と書いた場合、最初と2番目のnewしたインスタンスは、ガベージコレクタによっていずれ破棄されると考えてよろしいでしょうか。

また上記のコードを

A a = new A();
//なにかしら処理
A a = new A();
//なにかしら処理
A a = new A();
//なにかしら処理

のように、宣言から書きなおしている場合では、どのような違いがあるのでしょうか。

よろしくお願いします。

A 回答 (2件)

すいません、「同じメソッド内に同じ変数名を再度宣言することはできません」は「同じスコープ内に・・・」の誤りでした。



ループの中で A a = new A(); とした場合は、ループが1回終わるごとにループ内のローカル変数はガベージコレクタで破棄する対象となるため、1回目のループのときのaと2回目のループのときのaは別物になります。ループによってメモリは一方的に使用量が増加してくわけではなく、あるタイミングで破棄対象のインスタンスが解放されるようになります。
    • good
    • 1
この回答へのお礼

よくわかりました。
回答ありがとうございました!

お礼日時:2010/07/21 22:35

1: A a = new A();


2: a = new A();
1で作成されたインスタンスはaという変数で参照することができます。
2で新たなインスタンスを作ってaという変数で参照することができるようになります。1で作成されたインスタンスを参照できる変数はなくなりますので、いずれガベージコレクタによって破棄されます。

1: A a = new A();
2: A a = new A();
同じメソッド内に同じ変数名を再度宣言することはできませんよ。「ローカル変数 'a' はこのスコープで既に定義されています。」というコンパイルエラーが出るはずです。

同じ変数で違うインスタンスを参照させることについては問題ありません。ただ、変数の使い回しがコードのメンテナンス性、可読性の面でいいかというと、「???」です。ご質問とは別の問題ですが、気をつけたほうがいいと思います。
    • good
    • 1
この回答へのお礼

回答ありがとうございます。

2つ目のコードについては、おっしゃるとおり2つ宣言はできないみたいですね。

ただ、ループの中に「A a = new A();」
と宣言を入れた場合、メモリ的にはどうなるのでしょうか。(もしかしてこれもできない!?)

よろしくお願いします。

お礼日時:2010/07/19 11:28

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


おすすめ情報

このQ&Aを見た人がよく見るQ&A