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

Disposeにてアンマネージドコードとマネージドコードの違い

1 Mins read

前回の続きドス:evil:

前回「Dispose」の実装について記述しましたが

  'クラスのリソースを解放するオーバーロードされた Dispose メソッド。
  'このメソッドは基本クラスの Dispose メソッドおよび Finalize メソッドから呼び出す必要があります。
  Protected Overridable 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

引数にBuooleanの引数があり、内部If文でTrueとFalseで開放の種類を選別できる形になっていますが、
これの意味を解説しますね。

.NETではCLRという中間言語を使用して管理しています。

しかしWin32APIなど旧来のロジックも記述することが出来るので、開放時のタイミングがNew元が開放するのと
GC任せで開放するのではタイミングにずれが生じ、後者の場合CLR以外の記述がある時に問題が発生する可能性があります。

New元が呼び出す「Public Overloads Sub Dispose() Implements IDisposable.Dispose」内では

全ての開放が出来る「Dispose(True)」で呼び出され

いつ呼び出されるか分からない「Protected Overrides Sub Finalize()」内では

CLRが管理するものだけ開放が出来る「Dispose(False)」で呼び出されているのです。

なので特殊対応しているものでない限りIf外に記述することになるでしょうね:razz:

特殊対応は責任を持ってその都度、後処理が必要になるということですな:cool:

Read more
.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
ASP.NET

ASP.NET GET処理の日本語扱いについて

1 Mins read

ASP.NETでGET処理の日本語扱いについて

hoge.htmlなどからformのGetで日本語をhoge1.aspxなどに送るとうまく取得できない?現象に見舞われます。

これはサーバーサイドの文字コードの扱いによりこの問題が発生します。基本的に.NETはutf-8がDefualtなのでhtmlから送るとutf-8扱いになってしまいます。しかし中身はWindowsからの場合、shift-jisなので変換時にコケて空白扱いとなります。

解決方法は以下の2つです。(ほかにもあったら教えてちょ)

1.hoge.htmlをhoge.aspxにする

2.web.configの「responseEncoding」でサーバーサイドの文字コードを設定しているので、ここを「shift-jis」に変えてあげる

こんな感じかな(^ ^)

Read more