Finalyメソッドを2回呼べとはどういうことですか?

このQ&Aのポイント
  • Finalyメソッドを2回呼べとは、Disposeメソッドを呼び出す際にガーベージコレクションがFinalizeメソッドを呼び出すため、合計で2回実行されるということです。
  • クラスフィールドによって、Disposeメソッドを2回呼び出しても何も実行しないようにする必要があります。
  • Finalyメソッドが定義されているオブジェクトをマネージヒープから削除するためには、最低でも1回のガーベージコレクションが必要です。これは、Finalyメソッドによってオブジェクトがグローバル変数に代入される可能性があるためです。
回答を見る
  • ベストアンサー

Finalyメソッドを2回呼べとはどういうことですか?

ガーベージコレクション(FinalyとDispose)の疑問です。 Finalyメソッドを2回呼べとはどういうことですか? 本にはこう書いています。 Disposeメソッドを呼び出すとき、ガーベージコレクションがFinalizeメソッドを呼び出すので合計2回実行される。 クラスフィールドによって、クライアントがDisposeメソッドを2回呼び出しても何も実行しないようにする必要がある。 Finalyメソッドが定義されているオブジェクトをマネージヒープから削除するには、 最低でももう1回はガーベージコレクションを実行しなければならない。 これは、Finalyメソッドによって、現在のオブジェクトがグローバル変数に代入される可能性があるからだ。 Dispseメソッド 2回呼んだらダメ クラスフィールドで回避 ↓ Finalyメソッド 2回呼べ     ・・・対応方法不明・・・ Finalyメソッドを2回呼べとはどうしろといっているのですか?

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

そもそもFinalyメソッドなどと言うものが,.NET Frameworkの標準のライブラリには存在しません。 たまたま,その本のコードでFinalyというメソッドを作っていて,それの実装についての説明か何かなのではないでしょうか。

rescue100
質問者

お礼

ありがとうございます。 FinalizeとDisposeメソッドが存在するだけですね。 調べ直します。

その他の回答 (1)

回答No.1

> Disposeメソッドを呼び出すとき、ガーベージコレクションがFinalizeメソッドを呼び出すので合計2回実行される。 > クラスフィールドによって、クライアントがDisposeメソッドを2回呼び出しても何も実行しないようにする必要がある。 Finalizeメソッドは,通常の使用をしている限り,1度しか呼ばれません。 # Finalizeメソッド中で再度生存オブジェクトになった場合などが特殊例。 複数呼ばれる可能性があるのはDisposeメソッドの方です。 ただし,通常Disposeメソッドの中でGC.SupressFinalize(Me)を呼び出して,Finalize経由の呼び出しを抑制します。 > Dispseメソッド 2回呼んだらダメ クラスフィールドで回避 Disposeメソッドは複数回呼ばれても安全なように作る必要があります。 > Finalyメソッド 2回呼べ     ・・・対応方法不明・・・ FinalyメソッドがFinalizeメソッドの書き間違いだとして, そもそもFinalizeメソッドはシステムが呼び出す物なので,対応をする必要はありません。

rescue100
質問者

お礼

ありがとうございます。 FinalyメソッドとFinalizeメソッドがあるのですね。 どうも2種類を混合しているようです。 もう一度、本を読み直したいと思います。

関連するQ&A

  • Ruby 特異メソッドのnewが先に実行?

    Rubyのインスタンス生成について質問があります。 通常クラスを定義する場合は class Hoge ; def hello(); pirnt "hello"; end であると思います。 ただ Hoge = Class.new(); でもクラスは定義できるとききました。 ただこの場合Hogeクラスに定義できるのは HogeというClassクラスから作られた特異クラスとしてのHogeに 特異メソッドのみを定義できるということですよね? 通常のインスタンスメソッドは定義できませんよね? ではでは、 hoge = Class.new(); とした場合はどうなるのでしょうか? この場合は Classクラスの純粋なインスタンスとなるのでしょうか? 前者の定義とおなじ仕方ですが代入先が、通常の変数です。 この場合は、クラスオブジェクトとして生成されるのですか? オンラインマニュアルをみたところ 「新しく名前の付いていない superclass のサブクラスを生成します。 superclass が省略された時にはObject のサブクラスを生成します。 名前のないクラスは、最初に名前を求める際に代入されている定数名を検索し、見つかった定数名をクラス名とします。」 とあります。 上記内容は Classクラスの特異クラスとして定義されている特異メソッド(new)です。 これは Class.new()で作られたインスタンスを代入する先が定数であればその定数名と同じクラスを定義しつつそのClassクラスのクラスオブジェクトを生成するという意味合いでまちがいないでしょうか? 上記のとおりであれば hoge =Class.new()の場合は、やはりhogeというクラスを定義することになるのでしょうか? クラス定義は定数でなければならないはずですよね。 ただ実際、 p hoge;として出力すると#とひょうじされています。これはhogeがクラスオブジェクトではなく ただのインスタンスであるということでしょうか? であるならばこの hoge = Class.new()の式のnewはClassクラスオブジェクトに定義された特異メソッドではなく Classクラスに定義されたnewメソッド・・・・・つまりClassクラスに定義されたインスタンスメソッドの方のnewメソッドだとおもうのですが・・・・・・。 つまりこちらのメソッドですね。 「new( ... ) クラスのインスタンスを生成して返します。このメソッドの引数はブロック引数も含め initialize に渡されます。」 ※オンラインリファレンスから参照しました。 しかし 通常メソッドの検索は特異メソッドからはじまりその後クラスのインスタンスメソッド->親クラスのメソッドと 検索して行くとあります。 必ず先に、特異メソッドを実行しているはずだと思うのですが・・・。 やはり特異メソッドnewを実行しているのでしょうか? 長々すみませんが、ご教授ください。

    • ベストアンサー
    • Ruby
  • クラス変数とクラスメソッドを教えてください

    みんさんどうもすみません。クラス変数とクラスメソッドなんですが、 何回本を読んでもイマイチ理解できません。クラス変数とクラスメソッド を使うことでなにがメリットなのか教えてください。例えばクラスメソッド の場合はメソッド名の前にオブジェクト名をつけなくていいとか、そういう 便利さのために使うんでしょうか?どうもまだ完全に理解できていないの で詳しい方いらっしゃったらどうか教えてください。よろしくお願いします。

    • ベストアンサー
    • Java
  • ClientBase<TChannel> クラスの Dispose() メソッドについて

    お世話になっております。 http://oshiete1.goo.ne.jp/qa5572673.html に引き続き、 Dispose() メソッドの実装について不明な点があるので、よろしければご教示願います。 環境は、Visual C# 2008 Express Edition です。 .NET 3.5 まず、公開されているWebサービスに対して、 ソリューションエクスプローラより、サービス参照の追加で、Clientクラスを自動生成いたしました。 その自動生成されたクラス(仮に XSoapClient)が、System.ServiceModel.ClientBase<TChannel> クラスを継承しています。 ClientBase クラスは、IDisposable インタフェースを実装しているのですが、XSoapClient にも ClientBase にも、Dispose() メソッドの実装が見当たりません。 (自動生成のため、別の場所に作成されているのかもしれません。) using (XSoapClient client = new XSoapClient()) {  // ここにコード } とした場合に、client の Dispose() の実装がわからないため、 しっかりとコネクションが切れているのかが不明です。 Dispose() メソッド内では、Close() メソッドが呼ばれているのが普通なのでしょうか。 以上、よろしくお願いいたします。

  • staticメソッドにするかどうかの判断

    staticメソッドの使いどころについて質問させてください。 まず、メソッドの内部で、そのメソッドが定義されているクラスのイ ンスタンス変数を使用している場合は、そのメソッドはインスタンス に依存するので、インスタンスメソッドにしかできないのはわかり ます。疑問なのは、「じゃあこのメソッド内でインスタンス変数を使 わないで引数で渡せるように作れば、インスタンスに依存しないの でstaticにしていいの?」(※)ということです。 さらにこうも思います。 なんとなくですが、※のようなことをしたらオブジェクト指向の意味 がない気がします。理由ははっきりわかりません。ほんとになんとなく です。(奇跡的にあたっていたとしても、理由を教えて下さいm(_ _)m) そして、さらに混乱するのが、ユーティリティの関数などでstaticメ ソッドになっているのを見ました。この場合はどうしてメソッドの引 数を指定するようにしていて、クラスのインスタンス変数を使うこと はしないのか。 以上、大変下手な文章ですが、混乱しているポイントが伝わったでし ょうか? よろしくお願いします。

  • 使えるメソッドはクラスで予め指定されている?

    javaを始めたばかりでまだ右も左も分からないのですが、 (オブジェクトは作成してみましたが、クラス自体は作ったことがありません。) 例えば、Aというオブジェクトを作る為に、Bというクラスを使ったとします。 この際、使用できるメソッドというのは、クラスで予め定義されているものが使えるのでしょうか? それとも、クラスとオブジェクトというのは、全く切り離されたもので、 メソッドはjavaの世界で予め用意され、どんなオブジェクトを作成する時にも全て使用出来るものなのでしょうか? 教えてください!!

    • ベストアンサー
    • Java
  • クラスを作るとメソッドの数が多くなりすぎる

    クラスを作ると,たいがい,メソッドの数が多くなりすぎて,メソッドをさがすのに一苦労します. なにか,クラスのメソッドの設計でいい方法はないでしょうか? メソッドが増えすぎる原因として, ・フィールド変数1つにつき,取得メソッド,設定メソッドで(最大)2つ必要. ということがあります. あと, ・private のメソッド(クラス内部でよく使われる手続きをまとめたもの)が結構必要. ・private のメソッドから呼び出す private のメソッドが結構必要. ということがありますが,publicメソッドがこれらのメソッドと紛れてしまう,ということがあります.

    • ベストアンサー
    • Java
  • c#のToString()メソッド

    http://msdn.microsoft.com/ja-jp/library/ms173154(v=vs.90).aspx のページによると C# では、すべてのオブジェクトが ToString メソッドを継承します。このメソッドは、該当するオブジェクトの文字列形式を返します。たとえば、int 型の変数はすべて ToString メソッドを持ち、次のようにその変数の内容を文字列として返すことができます ↑と書いてあるのですが、C言語しか知らない自分にとってint型の変数が関数、メソッドを持つ、 という概念が理解できません。これはオブジェクト指向の話なのでしょうか?クラスを理解すると わかるようになりますか? どなたかよろしくお願いします。

  • メソッドの引数としてのthisの意味

    java初心者です。教えてください。 メソッドの引数としてのthisは何を表しているのですか? いろいろ調べてみてthisには以下の2つの使用法があることがわかりました。 1.インスタンス変数の名前とインスタンスメソッド内のローカル変数名がかぶったときに、メソッド内でインスタンス変数を表すときにthis.変数名とする。 2.あるクラスのコンストラクタ内で、同じクラスの別のコンストラクタを呼ぶときに使う。 しかし、引数としてのthisの意味がわかりません。 具体的には、addMouseListener(this);や、g.drawImage(img,10,10,this);のthisです。 後者の場合はオブジェクトgのインスタンスメソッドなので、thisはオブジェクトgへの参照を表しているのでしょうか?

    • ベストアンサー
    • Java
  • Stringクラスのlengthメソッドについて

    こんにちは、Stringクラスのlengthメソッドについて質問させてください。 今まで配列のlengthは、宣言時に長さが決定するからメソッドではなく、finalフィールドで十分。 ArrayListだとかは長さが変わるからメソッドという意識を持っていました。 (カプセル化の概念とも関わりますが) 先日その話しをしていたら、「でも文字列(Stringオブジェクト)の長さも不変だよね。」と言われました。 確かに文字列の長さは不変なのに、長さの取得にはメソッドを使っています。 言語仕様として一貫性を持たせるなら、配列もlengthメソッドにするか、文字列をlengthフィールドにしたほうが綺麗だと思うんです。 Stringクラスのソースコードを見ていたら、文字列の長さは内部的に private int count; と宣言されていました。 そして、lengthメソッドは return count; しているだけでした。 ただ、このcountフィールドに値を代入しているのはコンストラクタ内だけだったので、 public final int length; とすれば、良かったのでは?と思いました。 この考えについて、 それは間違っている、とか歴史的な背景などご存知でしたらご教授ください。 よろしくお願致します。

  • インターフェイスの使い方がわかりません(初心者です)

    Javaを始めたばかりの初心者です。 「やさしいJava」を買って一通り学んだのですが、 インターフェイスの使い方がよくわからず、困っています。 インターフェイスを実装することでインターフェイスが持つメソッドがすべて定義されてることが保障される、 というのはわかるんですが、そのことがどうして有用なのでしょう? また、具体的にはスレッドを扱うときにRunnableインターフェイスを実装する理由がわかりません。 Threadクラスのオブジェクトを作成するときに、 Runnableを実装したクラスのオブジェクトの変数を 引数にしないといけないんですよね? このとき、Runnableインターフェイスが 「runメソッドが定義されていなければならない」 とだけいうものだったとしたら、 Runnableを実装してなくてもrunメソッドさえ定義してあれば 実行できそうな気がするんですが・・・

    • ベストアンサー
    • Java

専門家に質問してみよう