.NETASP.NETパソコンのこと日記

DisposeとFinalize

1 Mins read

ガベージコレクション(以下GC)の話をしましたが、Classの良い所は前処理と後処理が出来るところだと思いますが、
.NETではFinalizeの実装はされていますが、これはGCのせいで、いつ呼び出されるか分かりません。

そのためプログラマは開放処理を狙って行えない!

メモリーの解放はシカトでもファイルのIOやDBのIOなど後処理をしたいClassが沢山ある:evil:
「Finalize」は外部から意図的にCall出来ないので後処理としてはあまり使えません。

VB6の頃はオブジェクトの開放といえば「Set obj = Nothing」でしたが、.NETでは「obj.Dispose」となりました。
しかし、この「Dispose」くんはControlやFormなどには標準でインターフェイスとして付いてますが、
プログラマが独自にClassを作成するときには明示してあげないと使えません・・・・・:sad:

そこで「Implements IDisposable」を実装して以下のようにしてあげます。

Public Class Class1
  Implements IDisposable
 
  'オブジェクトが破棄されたかどうかを追跡するためのフィールド。
  Protected disposed As Boolean = False
 
  Public Sub New()
  End Sub
 
  Protected Overrides Sub Finalize()
    MyBase.Finalize()
    Dispose(False)
  End Sub
 
  Public Overloads Sub Dispose() Implements IDisposable.Dispose
    Dispose(True)
    'GCに対して自分を解放してくれ!と命令!
     GC.SuppressFinalize(Me)
  End Sub
 
  'クラスのリソースを解放するオーバーロードされた Dispose メソッド。
  'このメソッドは基本クラスの Dispose メソッドおよび Finalize メソッドから呼び出す必要があります。
  Protected Overridable Overloads Sub Dispose(ByVal disposing As Boolean)
    If Not Me.disposed Then
      If disposing Then
        ' Insert code to free unmanaged resources.
      End If
    ' Insert code to free shared resources.
    End If
    Me.disposed = True
  End Sub
 
End Class

ここで出てくる「GC.SuppressFinalize(Me)」はGCからメモリ開放してと御願いしているので、
メモリー開放まで行わない方はコメントでも良いでしょう。

まぁ普通は破棄のタイミングも考えて開発しますからあって、良い処理ですな:wink:

そして「Protected Overridable Overloads Sub Dispose(ByVal disposing As Boolean)」の中に
開放ロジックを書いてあげて、呼び出し元には必ず「obj.Dispose」を呼んで貰うようにすればOK

VB6の場合「Set obj = Nothing」
 
.NETの場合「obj.Dispose」

「Dispose」が無いものは書かなくても良い=後処理無いのでメモリーの解放はGCに任せる!でもOKだが・・・

やっぱり綺麗に書くことが何事にもプラスに働くはず☆

Read more
.NETASP.NETパソコンのこと日記

ガベージコレクションとは?

1 Mins read

最近、色々な言語をやっていて頭の中がゴチャゴチャしてます(汗)

整理の意味を含めて少しプログラミングの復習をしてましたので覚書ドス:mad:

Subject通り、ガベージコレクションとは?ですが、古くは70年代からの考えらしいです。
メジャーな言語ではJavaに始まり、MSも.NETでこの法則を使っています。

簡単な説明としてはCやC++などではメモリ管理をプログラマーが行っていて
開放を忘れるとメモリーリークなどバグを見つけるのが一苦労な問題が発生します。

たまにC言語だとmallocとかで確保後、シカトしちゃってるのがあるからね:roll:
異常終了時も泣かされました:cry:

このメモリー管理をシステムサイドに任せる機能がガベージコレクションと言われるもので、
プログラマは好き勝手にメモリーを使用して、使い終わっても解放シカト状態・・・・・でも
定期的にメモリークリーンをシステムサイドで行ってくれるありがたい機能:!:

ここに非常に分かりやすく解説が載っているので必読です!

しかし、使ったメモリーを自分で開放しないとは・・・Oldマンとしては世も末だな・・・・

Read more
.NETASPASP.NET日記

Page(Context)オブジェクトを動的継承?

1 Mins read

さてさてASP.NETのお話です:razz:

ASP.NETで開発をしていると良くUI.Pageを継承したクラスを作成しますが、
継承はご存知のとおり多重にはできない。

しかも、Controls.Add追加するなど共通なロジックを入れたい場合はDLL(コンパイル)にしないといけない・・・

できれば簡単にaspxファイルなどにインプリメント系のテキストに記述したソースで、
ProcessのContextをもらえないかな?

と考えたとき・・・・強引?にありました。

Page_Loadなどイベントゲットできる、実行中のthis.Contextを与えてくれる機能が・・・

自身のクラスには「Inherits System.Web.UI.Page」してから

Public Sub New()
  '以前のトレース状態を保存
  Dim blnTrace As Boolean
  blnTrace = Current.Trace.IsEnabled
 
  'IDをセットしトレースをOffでProcessにセット
  Me.ID = "_" & _strTitle
  Me.Trace.IsEnabled = False
  Me.ProcessRequest(Current)
 
  'OldTrace情報を再セット
  Current.Trace.IsEnabled = blnTrace
End Sub

見事にPage_Load(イベント)やRequest(プロパティ)などのリソースを使用できます!

内部動作はと考えると・・・・

Pageを再度呼んでそうで一寸はロスしてそう:roll:

ま、Traceしてみて問題なさそうだからしばらく遊んでみよう!

Read more
.NET

.Netで作成したexeの起動が遅い訳

1 Mins read

時代の流れに乗り遅れている管理人ですが、VB.NETでもC#でも.NETで作成したProgramは、
何故か初回の起動が遅い???

もちろんVB6はネイティブコンパイルで.NETはCLRでJavaと一緒の中間ファイルになっているのが
原因なんだろう的に考えていたのだ・・・・・

しかし、こんな状態でお客さんにシステム開発したら?

お客さん「なんで昔(VB6)は早かったのに新しく(.NET)なったら遅くなるの!?」
管理人「始めの起動だけですので、2度目(メモリーに読み込まれる)からはストレス無く使えますよ(汗)」

このような状態になることは目に見えている。

で、遅まきながら(汗)

ネイティブ イメージ ジェネレータ (Ngen.exe) なんつーものがあるのを見っけました・・・遅くてごめん:wink:

ここにも詳しいくのっチょるよ

これはMSILで吐き出された.NETファイルをこれを咬ます事によりネイティブイメージに変身するらしい!!!
試しに・・・ポチポチ・・・ピコッ!・・・・おおっ速い:razz:

システムも人間と同じく初めが肝心である♪

Read more