- PR -

Staticな変数の寿命

投稿者投稿内容
未記入
大ベテラン
会議室デビュー日: 2006/05/19
投稿数: 125
投稿日時: 2007-01-10 14:29
VS2005 VBです。
初歩的な事ですがよろしくお願いいたします。

クラスAのTest2メソッドのstatic変数iについて
static変数の寿命は定義されているクラスが破棄されるまでと認識していたのですが
クラスBのTest1メソッドを呼び出すと、static変数iは加算され続けます。
Using〜EndUsingによりClassAは破棄されたのではないのでしょうか?
またstatic変数iはいつ0になるのでしょうか?
明示的に0にしなければならないのでしょうか?

【クラスA定義】
Public Class ClassA

Public Sub Test2
  Static i As Integer = 0    <-★
   i += 1
  Messagebox.Show(i.ToString)
End Sub

End Class

【クラスB定義】
Public Class ClassB

Public Sub Test1()
Using clsA as New ClassA
clsA.Test2
End Using
End Sub
End Class


どっとねっとふぁん
ぬし
会議室デビュー日: 2005/02/23
投稿数: 935
投稿日時: 2007-01-10 14:48
> static変数の寿命は定義されているクラスが破棄されるまでと認識していたのですが

アプリケーションの終了まで、ではなかったでしょうか。
未記入
大ベテラン
会議室デビュー日: 2006/05/19
投稿数: 125
投稿日時: 2007-01-10 15:00
プロシージャ内で宣言されたstatic変数の寿命は
クラスが消滅すまでのはずです。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2007-01-10 15:02
引用:

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

Public Class ClassB
  Public Sub Test1()
    Using clsA as New ClassA
      clsA.Test2
    End Using
  End Sub
End Class


Using について誤解があるようです。
Using は IDisposable.Dispose メソッドを自動で呼び出しているだけです。
あなたの定義した ClassA の Dispose メソッドの実装によって結果が変わるわけです。

引用:

どっとねっとふぁんさんの書き込み (2007-01-10 14:48) より:

アプリケーションの終了まで、ではなかったでしょうか。


というわけで、これはちょっと御幣があるのではないでしょうか。

[編集履歴]
 "あなたの定義した~" の日本語がおかしかったので、編集しました。
[/編集履歴]

[ メッセージ編集済み 編集者: じゃんぬねっと 編集日時 2007-01-10 15:09 ]
ue
ぬし
会議室デビュー日: 2005/05/07
投稿数: 581
お住まい・勤務地: 広島市
投稿日時: 2007-01-10 15:03
こんにちは。

引用:

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

Using〜EndUsingによりClassAは破棄されたのではないのでしょうか?


Using ステートメント というのは、ステートメントの終了時に IDisposable インターフェースを実装したオブジェクトの Dispose メソッドが実行されることを保証するためのもので、オブジェクトを破棄するためのものではないです。
_________________
上本亮介 (ue) @ わんくま同盟
Microsoft MVP for VSTO (Jul 2008 - Jun 2009)
Hello Another World!
.NET 勉強会 / ヒーロー島
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2007-01-10 15:05
引用:

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

プロシージャ内で宣言されたstatic変数の寿命はクラスが消滅すまでのはずです。


正しくは、そのクラスの 'インスタンスが' 消滅するまでの間ですね。

コード:

    Dim cls1 As New ClassA
    cls1.Test2()

    Dim cls2 As New ClassA
    cls2.Test2()


インスタンスごとにユニークですから。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
どっとねっとふぁん
ぬし
会議室デビュー日: 2005/02/23
投稿数: 935
投稿日時: 2007-01-10 15:20
あ、VBとC#でstaticの意味が違うのですね。。。
すみませんでした。
未記入
大ベテラン
会議室デビュー日: 2006/05/19
投稿数: 125
投稿日時: 2007-01-10 15:28
じゃんぬ様 ue様 ありがとうございます。

引用:

じゃんぬねっとさんの書き込み (2007-01-10 15:02) より:
Using について誤解があるようです。
Using は IDisposable.Dispose メソッドを自動で呼び出しているだけです。


そうでした。スイマセン忘れていました。

引用:

じゃんぬねっとさんの書き込み (2007-01-10 15:02) より:
あなたの定義した ClassA の Dispose メソッドの実装によって結果が変わるわけです。


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


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

【クラスA定義】
Public Class ClassA

Public Shared Sub Test2
  Static i As Integer = 0    <-★
   i += 1
  Messagebox.Show(i.ToString)
End Sub

End Class

【クラスB定義】
Public Class ClassB

Public Sub Test1()
ClassA.Test2
End Sub

End Class

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