- - PR -
Staticな変数の寿命
投稿者 | 投稿内容 | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2007-01-10 15:47
今回のような何の変哲もないクラスの場合、"自分でインスタンスを破棄" という考えはしません。 参照が未到達になれば、それまでです。(別のインスタンスには影響しませんから) (というより、参照 / メモリ / リソースを混同していませんか?)
同じインスタンスを利用して、外部から 0 にしなければならないという仕様がまずいでしょう。 相手は、プロシージャ内の Static 変数ですよ?
これこそ、どっとねっとふぁんさんの答えが使えると思います。 先ほどの Static 変数とは違い、Shared メンバは型に直接保持されています。 CLR (Common Language Runtime) は、必要な時に初めてアセンブリからモジュールをロードします。 ロードされた型は、アプリケーション ドメインが破棄されない限りはそのままです。 よって、型が直接保持している Shared メンバはそれまで保持されます。 # ところで "寿命" という言い回しは微妙かもしれませんね。 _________________ C# と VB.NET の入門サイト じゃんぬねっと日誌 | ||||||||||||
|
投稿日時: 2007-01-10 16:09
過去スレッドなどDispose関連はすべて目を通しているのですが いまだハッキリと理解するには至っていません。
そうですね。 インスタンスを分ければstatic変数iは0になります。 同じインスタンスを使って、外部から 0 にしなければならないというのは間違っていますね。 今回は初歩的な事ですが大変勉強になりました。 ご教授頂いてありがとうございました。 | ||||||||||||
|
投稿日時: 2007-01-10 16:16
何人たりとも、インスタンスを明示的に破棄することは出来ません。 オブジェクトインスタンスがすべての被参照を失ったとしても、まだ存命している可能性は十分にあり得ます。 その前提で設計を見直してください。 | ||||||||||||
|
投稿日時: 2007-01-10 16:21
とりあえず、GotDotNet Japan のアーカイブから IDisposable/Dispose/using に関してのスレッドを見ると良いでしょう。
今回はプロシージャ内の変数ですから、外部から変更できないです。(普通では) 外部から 0 にしなければならないのであれば、ただのインスタンス メンバでないと不自然ですよね。 ちなみに、プロシージャ内の Static 変数は、実際はプライベートなインスタンス メンバの変数で、 有効範囲 (スコープ) が、そのプロシージャ内に限定されるという異色の変数です。 外部から変更したい場合に代用すべきは、Shared メンバではないということに注意してください。 (Shared の話題が出ていたので、老婆心ながらに補足です) _________________ C# と VB.NET の入門サイト じゃんぬねっと日誌 | ||||||||||||
|
投稿日時: 2007-01-10 19:43
明らかにしなければならないことが、いくつかあると思います。
最初の投稿 2007-01-10 14:29 のコードは、本当に、インクリメントされ続けますか?または、本当にこのコードを実行しましたか? Shared でないメソッドの中の Static な変数は、インスタンスの生存期間と同じです。ですから、ClassB.Test1 メソッドのように、呼ばれる毎にインスタンスを作り直しているなら、毎回 0 からカウントされるはずです。 それだと仕様を満たさないので、何らかの変更を加えたコードで実行し、そして 0 に出来なくなっているのではないでしょうか。
このような質問の仕方よりも、具体的にどの様な要望があり、それを実現するにはどうしたらよいか?という質問の方が、答えに近づきやすいです。 具体的なコードがあると、人は、そのコードのみを考えます。しかし、ここで見ているコードは、「したいこと」ではなく、あなたが「こうしたらいいのでは?」と思っていることです。あなたが「思っていること」を、あなたが「したいこと」に一致させるには、あなたのしたいことを知る必要があります。 プログラムは、したいことを実行してはくれません。あなたが命じたことをしてくれるのみです。あなたの命じたことと、あなたのしたいことに差異があるうちは、あなたのしたいことを行ってはくれません。 _________________ | ||||||||||||
|
投稿日時: 2007-01-10 19:53
おそらく、End Using の後に clsA.Test2 メソッドを実行したのでしょう。 # それしかないということを、わかっていて書いていると思いますが。 _________________ C# と VB.NET の入門サイト じゃんぬねっと日誌 | ||||||||||||
|
投稿日時: 2007-01-10 21:27
ん〜。。それだと、
が、おかしくないですか?特に、「され続ける」と書いてあるし、MessageBox なので、10回も20回も呼び出してみた、と思っているのですが。 また、Using ブロックを抜けたインスタンスを使う…これって、スコープを外れているので出来ない(コンパイル エラーになる)のでは? # 2007-01-10 15:28 の分は、“デフォルト インスタンス”ですね。こう使うか(^-^; # 密かに、デフォルト インスタンスを使っているのでは?と思ってみたり。 _________________ |