- PR -

Staticな変数の寿命

投稿者投稿内容
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2007-01-10 15:47
引用:

未記入さんの書き込み (2007-01-10 15:28) より:

ClassAのTest2メソッド内のstatic変数iを0にするため(=ClassAインスタンスを破棄)するためには


今回のような何の変哲もないクラスの場合、"自分でインスタンスを破棄" という考えはしません。
参照が未到達になれば、それまでです。(別のインスタンスには影響しませんから)
(というより、参照 / メモリ / リソースを混同していませんか?)

引用:

どのようなコードを記述すればよいのでしょうか?


同じインスタンスを利用して、外部から 0 にしなければならないという仕様がまずいでしょう。
相手は、プロシージャ内の Static 変数ですよ?

引用:

また重ねて質問で申し訳ありませんが
ClassAのTest2メソッドがSharedの場合、Static変数iの寿命はどうなるのでしょうか?


これこそ、どっとねっとふぁんさんの答えが使えると思います。
先ほどの Static 変数とは違い、Shared メンバは型に直接保持されています。

CLR (Common Language Runtime) は、必要な時に初めてアセンブリからモジュールをロードします。
ロードされた型は、アプリケーション ドメインが破棄されない限りはそのままです。
よって、型が直接保持している Shared メンバはそれまで保持されます。

# ところで "寿命" という言い回しは微妙かもしれませんね。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
未記入
大ベテラン
会議室デビュー日: 2006/05/19
投稿数: 125
投稿日時: 2007-01-10 16:09
引用:

じゃんぬねっとさんの書き込み (2007-01-10 15:47) より:
(というより、参照 / メモリ / リソースを混同していませんか?)


過去スレッドなどDispose関連はすべて目を通しているのですが
いまだハッキリと理解するには至っていません。

引用:

じゃんぬねっとさんの書き込み (2007-01-10 15:47) より:
同じインスタンスを利用して、外部から 0 にしなければならないという仕様がまずいでしょう。
相手は、プロシージャ内の Static 変数ですよ?


そうですね。
インスタンスを分ければstatic変数iは0になります。
同じインスタンスを使って、外部から 0 にしなければならないというのは間違っていますね。

今回は初歩的な事ですが大変勉強になりました。
ご教授頂いてありがとうございました。
渋木宏明(ひどり)
ぬし
会議室デビュー日: 2004/01/14
投稿数: 1155
お住まい・勤務地: 東京
投稿日時: 2007-01-10 16:16
引用:

ClassAのTest2メソッド内のstatic変数iを0にするため(=ClassAインスタンスを破棄)するためにはどのようなコードを記述すればよいのでしょうか?



何人たりとも、インスタンスを明示的に破棄することは出来ません。

オブジェクトインスタンスがすべての被参照を失ったとしても、まだ存命している可能性は十分にあり得ます。

その前提で設計を見直してください。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2007-01-10 16:21
引用:

未記入さんの書き込み (2007-01-10 16:09) より:

過去スレッドなどDispose関連はすべて目を通しているのですがいまだハッキリと理解するには至っていません。


とりあえず、GotDotNet Japan のアーカイブから IDisposable/Dispose/using に関してのスレッドを見ると良いでしょう。

引用:

インスタンスを分ければstatic変数iは0になります。
同じインスタンスを使って、外部から 0 にしなければならないというのは間違っていますね。


今回はプロシージャ内の変数ですから、外部から変更できないです。(普通では)
外部から 0 にしなければならないのであれば、ただのインスタンス メンバでないと不自然ですよね。

ちなみに、プロシージャ内の Static 変数は、実際はプライベートなインスタンス メンバの変数で、
有効範囲 (スコープ) が、そのプロシージャ内に限定されるという異色の変数です。

外部から変更したい場合に代用すべきは、Shared メンバではないということに注意してください。
(Shared の話題が出ていたので、老婆心ながらに補足です)

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2007-01-10 19:43
 明らかにしなければならないことが、いくつかあると思います。


 最初の投稿 2007-01-10 14:29 のコードは、本当に、インクリメントされ続けますか?または、本当にこのコードを実行しましたか?
 Shared でないメソッドの中の Static な変数は、インスタンスの生存期間と同じです。ですから、ClassB.Test1 メソッドのように、呼ばれる毎にインスタンスを作り直しているなら、毎回 0 からカウントされるはずです。
 それだと仕様を満たさないので、何らかの変更を加えたコードで実行し、そして 0 に出来なくなっているのではないでしょうか。


引用:

ClassAのTest2メソッド内のstatic変数iを0にするため(=ClassAインスタンスを破棄)するためにはどのようなコードを記述すればよいのでしょうか?


 このような質問の仕方よりも、具体的にどの様な要望があり、それを実現するにはどうしたらよいか?という質問の方が、答えに近づきやすいです。
 具体的なコードがあると、人は、そのコードのみを考えます。しかし、ここで見ているコードは、「したいこと」ではなく、あなたが「こうしたらいいのでは?」と思っていることです。あなたが「思っていること」を、あなたが「したいこと」に一致させるには、あなたのしたいことを知る必要があります。

 プログラムは、したいことを実行してはくれません。あなたが命じたことをしてくれるのみです。あなたの命じたことと、あなたのしたいことに差異があるうちは、あなたのしたいことを行ってはくれません。

_________________
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2007-01-10 19:53
引用:

Jittaさんの書き込み (2007-01-10 19:43) より:

 最初の投稿 2007-01-10 14:29 のコードは、本当に、インクリメントされ続けますか?または、本当にこのコードを実行しましたか?
 Shared でないメソッドの中の Static な変数は、インスタンスの生存期間と同じです。ですから、ClassB.Test1 メソッドのように、呼ばれる毎にインスタンスを作り直しているなら、毎回 0 からカウントされるはずです。
 それだと仕様を満たさないので、何らかの変更を加えたコードで実行し、そして 0 に出来なくなっているのではないでしょうか。


おそらく、End Using の後に clsA.Test2 メソッドを実行したのでしょう。

# それしかないということを、わかっていて書いていると思いますが。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2007-01-10 21:27
引用:

じゃんぬねっとさんの書き込み (2007-01-10 19:53) より:
おそらく、End Using の後に clsA.Test2 メソッドを実行したのでしょう。

# それしかないということを、わかっていて書いていると思いますが。


ん〜。。それだと、
引用:

> クラスBのTest1メソッドを呼び出すと、static変数iは加算され続けます。


が、おかしくないですか?特に、「され続ける」と書いてあるし、MessageBox なので、10回も20回も呼び出してみた、と思っているのですが。
 また、Using ブロックを抜けたインスタンスを使う…これって、スコープを外れているので出来ない(コンパイル エラーになる)のでは?


# 2007-01-10 15:28 の分は、“デフォルト インスタンス”ですね。こう使うか(^-^;
# 密かに、デフォルト インスタンスを使っているのでは?と思ってみたり。
_________________

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