- PR -

インスタンスの有効期限

1
投稿者投稿内容
とらべすてぃ
会議室デビュー日: 2006/03/12
投稿数: 3
投稿日時: 2006-03-12 14:14
すみません。非常に恥ずかしい質問なのですが恥を忍んでお聞きします。
C#とかVBなど、Winアプリ組むのは初めてなので的はずれな(?)質問かも
しれませんがご容赦いただけたら幸いです。

お聞きしたいことを単刀直入にお聞きすると、

「インスタンスの参照は誰か(どこか)が保持していればインスタンスは
 保持されますか?」

ということなんです。
例えば
コード:

public class Form1:Form
{
private Collection<MyClass> myClassCollect;

public void Method()
{
MyClass myClass = new MyClass();
myClassCollect.Add(myClass);
}
}


このコードでmyClassはMethod内のスコープで当該メソッドが終了したら
myClassは保証されない(消滅?)と思いますが、メソッド内で
コレクションにインスタンスの参照を渡し(結合?)、恐らくこのコレクション内で
MyClass myClass = new MyClass();で生成したインスタンスの参照を
保持しているので、myClassは消滅してもmyClassCollectが生き残っている
限りインスタンスは消えないか?という事なんです。
(もちろんRemoveとかはされてないという前提で)

説明が下手ですみません。
もう一つサンプルコードで。
コード:

public class Form1:Form
{
MyData myData = new MyData();
public Method()
{
MyClass myClass = new MyClass();
myData.Method(myClass);

}
}
public class MyData
{
private MyClass myCls;

public Method(MyClass arg)
{
myCls = arg;
}
}


また同じようにメソッド内でMyClassのインスタンスを生成して
一端ローカルのmyClassで参照を保持して、myData.Methodを呼んで
参照を渡しmyDataのインスタンス内で参照を保持する。
myData.Method()終了後Form1.Method()も終了しmyClassは消滅。
しかしmyDataが先ほど生成したインスタンスを保持しているので
myDataのインスタンスが生きている限り、先ほど生成したmyClass
のインスタンスは保証されると言うことで宜しいでしょうか?

実際上記のようなコードでアプリを動かしていますが
参照先がみつからない等のエラーは出てないようなのでこのような
解釈になりました。

何卒宜しくお願い申し上げます。


[ メッセージ編集済み 編集者: とらべすてぃ 編集日時 2006-03-12 14:17 ]

[ メッセージ編集済み 編集者: とらべすてぃ 編集日時 2006-03-12 14:17 ]
囚人
ぬし
会議室デビュー日: 2005/08/13
投稿数: 1019
投稿日時: 2006-03-12 14:26
全くその通り、誰かが参照している限り保持されます。
以下を参照してみてください。
http://www.microsoft.com/japan/msdn/net/mag00/GCI.asp
_________________
囚人のジレンマな日々
とらべすてぃ
会議室デビュー日: 2006/03/12
投稿数: 3
投稿日時: 2006-03-12 15:58
囚人様
素早いご返答ありがとうございます。
ANSI Cで育ったもので、この辺すごく違和感有りましたが
慣れるとやみつきですね。

大変お手数をおかけしました。今後ともよろしくお願いします。


#もしかしてインスタンスを擬人化して「誰」とか「生きてる」
という表現は古いですか?
わざわざ私のレベルにあわせていただいて恐縮です。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-03-12 16:26
問題。

コード:

    private void oneMethod() {
        Form2 frm2 = new Form2();
        frm2.Show();
    }


この場合はどうか?

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
囚人
ぬし
会議室デビュー日: 2005/08/13
投稿数: 1019
投稿日時: 2006-03-12 21:42
引用:

#もしかしてインスタンスを擬人化して「誰」とか「生きてる」
という表現は古いですか?


私もよくそう表現してます.

引用:

じゃんぬねっとさんの書き込み (2006-03-12 16:26) より:
問題。

コード:

    private void oneMethod() {
        Form2 frm2 = new Form2();
        frm2.Show();
    }


この場合はどうか?




解答.
誰も参照していないフォームは、何故 GC の対象にならないのか
宣伝してみる….考えた後で見てください^^;

_________________
囚人のジレンマな日々
unibon
ぬし
会議室デビュー日: 2002/08/22
投稿数: 1532
お住まい・勤務地: 美人谷        良回答(20pt)
投稿日時: 2006-03-12 22:04
引用:

じゃんぬねっとさんの書き込み (2006-03-12 16:26) より:
コード:

    private void oneMethod() {
        Form2 frm2 = new Form2();
        frm2.Show();
    }




C# は良く知らないのですが、結局は static の弊害だと思います。Form2 のどこかで、とあるクラスの static なメソッドを呼んで Form2 自身のインスタンスを登録するようなことをやっているからなのですよね。こういう暗黙なことでやるのではなく、Form2 のコンストラクターの引数でそういう登録先のマネージャーのようなインスタンスを指定するほうが、素直だと思います。
Java の AWT/Swing も似たような感じだし、(VB.NET ではなく) VB の Form の Load の仕組みもややこしさは似たようなものだと感じます。明示的なインスタンスのやりとりでやってくれたほうが、分かりやすくなると思うのですが、いざやるとなると、とたんにごちゃごちゃしてしまうのでしょうね、きっと。
1

スキルアップ/キャリアアップ(JOB@IT)