- - PR -
インスタンスの有効期限
1
投稿者 | 投稿内容 | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2006-03-12 14:14
すみません。非常に恥ずかしい質問なのですが恥を忍んでお聞きします。
C#とかVBなど、Winアプリ組むのは初めてなので的はずれな(?)質問かも しれませんがご容赦いただけたら幸いです。 お聞きしたいことを単刀直入にお聞きすると、 「インスタンスの参照は誰か(どこか)が保持していればインスタンスは 保持されますか?」 ということなんです。 例えば
このコードでmyClassはMethod内のスコープで当該メソッドが終了したら myClassは保証されない(消滅?)と思いますが、メソッド内で コレクションにインスタンスの参照を渡し(結合?)、恐らくこのコレクション内で MyClass myClass = new MyClass();で生成したインスタンスの参照を 保持しているので、myClassは消滅してもmyClassCollectが生き残っている 限りインスタンスは消えないか?という事なんです。 (もちろんRemoveとかはされてないという前提で) 説明が下手ですみません。 もう一つサンプルコードで。
また同じようにメソッド内でMyClassのインスタンスを生成して 一端ローカルのmyClassで参照を保持して、myData.Methodを呼んで 参照を渡しmyDataのインスタンス内で参照を保持する。 myData.Method()終了後Form1.Method()も終了しmyClassは消滅。 しかしmyDataが先ほど生成したインスタンスを保持しているので myDataのインスタンスが生きている限り、先ほど生成したmyClass のインスタンスは保証されると言うことで宜しいでしょうか? 実際上記のようなコードでアプリを動かしていますが 参照先がみつからない等のエラーは出てないようなのでこのような 解釈になりました。 何卒宜しくお願い申し上げます。 [ メッセージ編集済み 編集者: とらべすてぃ 編集日時 2006-03-12 14:17 ] [ メッセージ編集済み 編集者: とらべすてぃ 編集日時 2006-03-12 14:17 ] | ||||||||||||
|
投稿日時: 2006-03-12 14:26
全くその通り、誰かが参照している限り保持されます。
以下を参照してみてください。 http://www.microsoft.com/japan/msdn/net/mag00/GCI.asp _________________ 囚人のジレンマな日々 | ||||||||||||
|
投稿日時: 2006-03-12 15:58
囚人様
素早いご返答ありがとうございます。 ANSI Cで育ったもので、この辺すごく違和感有りましたが 慣れるとやみつきですね。 大変お手数をおかけしました。今後ともよろしくお願いします。 #もしかしてインスタンスを擬人化して「誰」とか「生きてる」 という表現は古いですか? わざわざ私のレベルにあわせていただいて恐縮です。 | ||||||||||||
|
投稿日時: 2006-03-12 16:26
問題。
この場合はどうか? _________________ C# と VB.NET の入門サイト じゃんぬねっと日誌 | ||||||||||||
|
投稿日時: 2006-03-12 21:42
私もよくそう表現してます.
解答. 誰も参照していないフォームは、何故 GC の対象にならないのか 宣伝してみる….考えた後で見てください^^; _________________ 囚人のジレンマな日々 | ||||||||||||
|
投稿日時: 2006-03-12 22:04
C# は良く知らないのですが、結局は static の弊害だと思います。Form2 のどこかで、とあるクラスの static なメソッドを呼んで Form2 自身のインスタンスを登録するようなことをやっているからなのですよね。こういう暗黙なことでやるのではなく、Form2 のコンストラクターの引数でそういう登録先のマネージャーのようなインスタンスを指定するほうが、素直だと思います。 Java の AWT/Swing も似たような感じだし、(VB.NET ではなく) VB の Form の Load の仕組みもややこしさは似たようなものだと感じます。明示的なインスタンスのやりとりでやってくれたほうが、分かりやすくなると思うのですが、いざやるとなると、とたんにごちゃごちゃしてしまうのでしょうね、きっと。 |
1