- PR -

インスタンス開放のタイミングについて

投稿者投稿内容
囚人
ぬし
会議室デビュー日: 2005/08/13
投稿数: 1019
投稿日時: 2005-11-22 10:43
もっとはっきりとやりたい事を書かれたほうが良いと思います。
イオンさんが言っている「破棄」や「生存期間」は、多分見ている人は違う意味で受け取ってしまうでしょう。
Unload とは一体何の Unload ですか?フォーム?コントロール?アプリケーションドメイン?

_________________
囚人のジレンマな日々
イオン
ベテラン
会議室デビュー日: 2005/10/18
投稿数: 81
投稿日時: 2005-11-22 10:58
目的はそのクラスの生存期間の最後にある処理をしたいと考えています。

1.インスタンスがたったタイミングでまず初期処理(初期化などです。)
2.処理あれこれ・・
3.最後に終了処理

こんなながれを考えています。
1に関してはNewを使用することでインスタンスをたてる側はまったく意識せずに
そのクラスを使用することが出来ると思います。

3に関しても同じようにしたいというのが目的です。
終了しょりをインスタンスを立てた側で実行(try finallryなど何でもいいです。)すれば
全く問題ないのですが、できればその終了処理を意識することなく使わせてあげたいと
考えていました。

具体的にはトランザクションです。トランザクション管理を全く使う側に意識させずに、
そのクラスの生存期間内で更新だけしてくだいさいと。
いつそのクラスを使ってる側で更新が終了したかが判断できれば良いのですが、
その判断はクラスの生存期間で判断できないかと考えていました。
他に良い方法があればぜひ教えてください、お願いします
渋木宏明(ひどり)
ぬし
会議室デビュー日: 2004/01/14
投稿数: 1155
お住まい・勤務地: 東京
投稿日時: 2005-11-22 11:00
引用:

Finalizeに関してはどうもタイムラグあるようなのです。
そのインスタンスの生存期間が終わったからといってFinalizeが起こるわけではなく、
ガベージコレクタの関係でそのタイミングは予測できないようなのです。

うまく拾うことはできないのでしょうか・・・



スコープを抜けたりして、インスタンスがすべての参照を失う時を捕まえたいわけですよね?

であれば、できないです。
.NET のランタイムは「それ」を管理していません。

Unload() のようなメソッドを用意して「必ずそれを呼び出す」ように運用するか、IDisposable.Dispose() を実装して using 句で「それらしく」見せかけるくらいしか道はないと思います。(後者は本来の目的と大分異なるので勧めませんが)
囚人
ぬし
会議室デビュー日: 2005/08/13
投稿数: 1019
投稿日時: 2005-11-22 11:06
C++ であれば、スタックにおかれたインスタンスは、スコープから外れた時点でデストラクタが必ず呼ばれるので、終了処理はそこで書きますね。
ヒープにおかれたインスタンスは、delete された時点でデストラクタが呼ばれますね。
つまりデストラクタが呼ばれるタイミングが保障されるので、そのクラスの終了処理はデストラクタに書きます。

.NET はガベージコレクションのおかげでメモリ管理をしなくてすみましたが、インスタンスが「破棄」されるタイミングが分かりません。では終了処理はどうするのか。
Dispose() に書く、というのがそうです。
C# であれば構文レベルで Dispose の呼び出しがサポートされています。(using)(VB.NET も 2005 からサポート)

例えば、SqlConnection なんかは、Dispose() (Close())されると、保留中のトランザクションはロールバックされます。
_________________
囚人のジレンマな日々
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2005-11-22 11:11
引用:

イオンさんの書き込み (2005-11-22 10:58) より:

いつそのクラスを使ってる側で更新が終了したかが判断できれば良いのですが、
その判断はクラスの生存期間で判断できないかと考えていました。


実際そのクラス (ラッパ クラスかな?) がどのような機能を提供しているのか判りませんが、
更新メソッド呼び出すたびに、暗黙的に Open / Close するんですか? (^^;)

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
たつごろー
ぬし
会議室デビュー日: 2004/10/25
投稿数: 496
投稿日時: 2005-11-22 11:11
引用:

具体的にはトランザクションです。トランザクション管理を全く使う側に意識させずに、
そのクラスの生存期間内で更新だけしてくだいさいと。


このへんは意識してやるように設計されています。
なのでそれに従うべきだと思います。

_________________
たつごろー
codeseek
こみゅぷらす
イオン
ベテラン
会議室デビュー日: 2005/10/18
投稿数: 81
投稿日時: 2005-11-22 13:45
>更新メソッド呼び出すたびに、暗黙的に Open / Close するんですか?

暗黙的という分けではないのですが、その更新メソッド内でのみトランザションを
完結(表現は変ですが・・)させたいといことです。
その際にトラザクション管理は、そのクラスの内部でやるから、
更新する側(インスタンスを立てて更新機能のみ使う側)では、トランザクションは
気にしなくていいよという作りにできないかと。

でもやはり限界はあるようですね。
ありがとうございました!!
囚人
ぬし
会議室デビュー日: 2005/08/13
投稿数: 1019
投稿日時: 2005-11-22 15:09
コード:
public abstract class TransactionCommand
{
  public void Execute()
  {
    try
    {
      開く
      トランザクション開始
      ExecuteContent( ・・・ );
      コミット
    }
    catch
    {
      ロールバック
    }
    finally
    {
      閉じる
    }
  }

  protected abstract void ExecuteContent( ・・・ 必要があれば、DBコネクションとか );
}

public class その1Command : TransactionCommand
{
  protected override void ExecuteContent()
  {
    接続開く?閉じる?トランザクション?そんなのしらねー。
  }
}


こんなんとか。
_________________
囚人のジレンマな日々

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