• ベストアンサー

C# インスタンスの破棄

C#でインスタンスの破棄を明示的に行いたいのですが、 実際の開発現場では、どのように行っているのでしょうか? 自分で調べると「ガベージコレクタ」が暗黙的に行っているようですが明示的には行わないのが普通なのでしょうか? もしくは、「Dispose」を使用して明示的に行うのが普通なのでしょうか? 実際に開発されている方からすると簡単な事かもしれませんが教えて頂けると助かります。 以上ですが、よろしくお願いいたします。

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

  • ベストアンサー
  • Splatter
  • ベストアンサー率41% (181/440)
回答No.1

結論から言うと、どちらでも良いです。 できれば生成から破棄まで考えて開発できると良いですね。 ガベージコレクションが実行されることで自動開放されますから、 一切.close()や.dispose()を使わなかったとしてもプログラムが 不正終了してしまう事はほとんどありません。 実際の開発では使わなくなったものを使わなくなった時点で 明示的に破棄することが多いです。正確には明示的に破棄するもの、 明示的に破棄しないもの、の2種類に分類しています。 例えばファイルを読み書きするストリーム系のオブジェクトや データベースとのコネクションなどです。これは開発会社や 開発チーム、案件によって若干違っていて、徹底するところや 適当なところもあります。個人的には徹底したい派ですが。。。 ガベージコレクションが発生するとプログラムの実行動作が 遅くなり、また瞬間的に大きな負担がかかることがあります。 そのため全てをガベージコレクタに任せるのではなく、 明示的に開放できるもの、メモリを大量に消費するものは その都度、適切に開放していくことで処理効率が良くなります。 プログラミング関連の調べ物で、サンプルソース等を見ることが あるかと思います。この時サンプルで明示的に開放していたら、 それは明示的に開放したほうが良いもの、と思いましょう。 これだけでもステップアップになりますね。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (1)

noname#259269
noname#259269
回答No.2

インスタンスの破棄は、変数に null を代入することで行います(もしくはロジックのスコープを抜ける時)。 Dispose について誤解している方が多いのですが、 Dispose は、あくまでインスタンスが内包している「メモリ以外の資源」を解放してもらうよう、そのインスタンスに依頼するものです(Disposeを呼ばれた時の処理は、そのクラスの実装者が適切に行う必要があります)から、全く意味が異なります。 Dispose メソッド(IDisposable インタフェース)を持つクラスのオブジェクトは、使い終わったら Dispose を呼んでくれ、というのがルールになっていますので、呼びましょう。using 句を使うのが確実です。try 句の finally 内で Dispose しても構いません。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • インスタンス破棄時にメモリが解放されるようにしたい

    C++言語でプログラムを作成しています あるクラスでインスタンス生成時に動的にメモリを割り当てた後 インスタンスが破棄されるまでそれを使用し インスタンス破棄時に解放するにはどうしたらいいでしょうか デストラクタで解放処理を実装すると 明示的にデストラクタが呼ばれた際に解放されてしまい インスタンスが破棄されるまで使用できませんでした

  • C# クラスのインスタンスについて

    クラス(ClassA)を作成した後に別のクラス(ClassB)内でClassAインスタンスを作成したとします。 このインスタンスをさらに別のクラス(ClassC)で使用したいと思うの ですが可能なんでしょうか? 要するに1つのインスタンスを他で使いまわすような事ができないの かなって思っています。 自分で調べると「Singletonパターン」という方法があるようですが 他の方法もあれば知ってみたいと思っています。 ※環境はWinXP、VS2005 C# です。 以上ですが、よろしくお願いいたします。

  • C++でのクラスオブジェクトの破棄

    こんにちは。 C++では、プログラムの終了時に、全てのクラスオブジェクトは、デストラクタが呼び出されて破棄されますが、プログラムの途中で、クラスオブジェクトを明示的に破棄する方法はあるのでしょうか? 例えば、new演算子によってメモリを動的に割り当てたポインタなら、delete演算子で破棄できますが、 クラスオブジェクトにdelete演算子は使えないようです。 何かいい方法を知っておられる方がいらっしゃれば、是非アドバイスを頂きたいと思います。

  • インスタンス生成について

    いつもお世話になっております。 今回はインスタンス生成について質問させて下さい。 String クラスのインスタンス生成は、 String str1 = new String(); のように明示的に new 演算子を用いる方法と、 String str2 = "hoge"; のように生成する方法がありますよね。 str2 の方は、JVM が(?) 勝手にコンストラクタを呼び出してくれて、 インスタンスを生成してくれる、という認識でよいのでしょうか? また、明示的に「 new 演算子 + コンストラクタ」でインスタンスを生成する場合と、 そうでない場合の使い分けなどはあるのでしょうか? そもそも String 以外に、このような複数のパターンでインスタンスを生成することができる クラスは他にもあるのでしょうか? 以上、ご教授宜しくお願い致します。

    • ベストアンサー
    • Java
  • OracleでのDBインスタンス作成方法を教えて下さい

    現在、VC++とOracle(8.1.7)を使っての業務アプリケーション開発に携わっています。 が、VC++もOracleも開発時に必要に応じて知識をつけて来たため、基本的な理解が乏しく、一度自分だけでアプリケーションを作ってみようと考えています。 そこでまずDBインスタンスを作ろうと思い、Oracle8.1.7をフルインストールしたのですが、どのツールを使ってインスタンスを生成すれば良いのかもわかりません。 この辺りの事がわかる方、教えて下さい。 また、この辺りの技術をわかりやすく説明しているHPや書籍などありましたら紹介して下さると助かります。 よろしくお願いしますm(_ _)m なお使用OSはWin2000です。

  • インスタンス化について

    .NETでのインスタンス化について .NETでプログラムの勉強をしています。インスタンスについてお教えください。 ↓では、「sr」はnewキーワードを使ってインスタンス化しています。 ********************************************************************************** //"C:\test.txt"をShift-JISコードとして開く System.IO.StreamReader sr = new System.IO.StreamReader( @"C:\test.txt", System.Text.Encoding.GetEncoding("shift_jis")); //内容をすべて読み込む string s = sr.ReadToEnd(); //閉じる sr.Close(); //結果を出力する Console.WriteLine(s); ↓では、「enc」はnewキーワードを使ってインスタンス化していません。 ********************************************************************************** //読み込むテキストファイル string textFile = "C:\\text.txt"; //文字コード(ここでは、Shift JIS) System.Text.Encoding enc = System.Text.Encoding.GetEncoding("shift_jis"); //テキストファイルの中身をすべて読み込む string str = System.IO.File.ReadAllText(textFile, enc); //行ごとの配列として、テキストファイルの中身をすべて読み込む string[] lines = System.IO.File.ReadAllLines(textFile, enc); ********************************************************************************** 質問1: インスタンス化させる時にはnewキーワードが必要だと思っていましたが、「enc」はnewキーワードが使用されていません。 なぜでしょうか? 質問2: System.IO.StreamReader sr = new System.IO.StreamReader( @"C:\test.txt", System.Text.Encoding.GetEncoding("shift_jis")); 上記のように、newと同時にパスやエンコーディングを引数として渡しています。この事をコンストラクタとよぶのでしょうか? Googleで調べていますが、いまいち意味がわかりません・・・物凄くひらたくいうとどういったことなのでしょうか?何かプログラムではない、一般的な事で例えて頂けるとありがたいです。 宜しくお願い致します。

  • VC++2010でインスタンス名のチェック

    VisualStudio2010でC++の勉強をしています。 メモリーに生成されているオブジェクト名(class名)を見る方法は無いでしょうか? インスタンス生成時にnew した場合としない場合とあると思うのですが、 明示的にデストラクトを行おうと思っています。 windowsのリソースモニターでは容量は見えるのですが、オブジェクト名を見たいのですが、方法が解りません。 VisualStudio2010にその様な機能は容易されていないのでしょうか? ご存じの方がおられましたら、アドバイスよろしくお願いいたします。

  • VC++:ダイアログがDispose()できない

    前略 ・.NET 2012のVC++を使っています。 ファイルをオープンするプログラムをつくろうとしています。その過程でダイアログをオープンするプログラムをネットにあったC#のコードを参考に、openFileDialog1->Dispose();をコメントアウトした以下に示すものをつくりました。このコードは特に問題なくコンパイルできて動作します。  しかし、C#のコードにあった openFileDialog1.Dispose();から変更したopenFileDialog1->Dispose();を追加すると "error C2039: 'Dispose' : 'System::Windows::Forms::OpenFileDialog' のメンバーではありません。"と云うエラーメッセージがでてコンパイルできません。 <質問>  VC++の場合 C#のopenFileDialog1.Dispose();に相当するオブジェクト破棄のコードは不要なのでしょうか?  もし、破棄が必要なのであればどのようなコードを書けばよいのでしょうか?  どなたかお分かりになる方、ご教示いただければ幸いです。 以上、よろしくお願いします。 //------------------------------------------------------- private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) { OpenFileDialog^ openFileDialog1 = gcnew OpenFileDialog();//new OpenFileDialog(); openFileDialog1->Title = "ダイアログのタイトルをココに書く"; openFileDialog1->InitialDirectory = "c:\\"; openFileDialog1->FileName = "初期表示するファイル名をココに書く"; if (openFileDialog1->ShowDialog() == System::Windows::Forms::DialogResult::OK) MessageBox::Show(openFileDialog1->FileName); // 不要になった時点で破棄する (正しくは オブジェクトの破棄を保証する を参照) // openFileDialog1->Dispose(); };

  • ASPX(C#)で別ファイルで自分で作成したクラスをインスタンスかする

    ASPX(C#)で別ファイルで自分で作成したクラスをインスタンスかするには? IIS6.0 + .netframework2.0です。 Windowsアプリを作成しその認証用に上記環境でライセンス認証だけをするプログラムを作りたいのですが・・・ Windowsアプリの方でまとめたライブラリをコピーしてそのまま使いたいのですが単純に配置しただけでは呼び出しができません。 たとえば以下のような状況です。 check.aspx ユーザーがアクセスするページ check.aspx.cs このファイル内でインスタンス化して使用したい lib/utils.cs インスタンスかしたいクラスが記述 check.aspx.cs内で using~で記述してもエラーになりますし その参照をどこかに書く必要があるのだろうな?とはわかるのですが .netでWEBアプリをいじるのは初めてなのでどこをどういじっていいのかわかりません。 よろしくお願いします。

  • C、C++でのゲーム開発

    スクエニやコーエーなどのゲーム会社が使用している開発言語はCやC++と聞きました。(PS2など) そこで興味本位でCを勉強してみようと思ったのですが、ゲームの開発でCが選ばれている理由の一つに、Cは.NET Freamworkを通さないというのが大きな理由であると聞きました。 現在私はVisual C++というソフトを使用しているのですが、どうもこれは.NET Freamworkを使用しているようなことが書かれていました。(何か解釈を間違っているかもしれませんが) そこで一度疑問を整理しようと思い、質問させていただきます ゲームの開発言語としてC系が多く選ばれている理由は何でしょうか?(オブジェクト指向言語が選ばれない理由) また、ゲーム会社はどのような環境で開発を行っているのでしょうか?(Visual C++など.NET Freamworkを介するようなソフトは使用しないのでしょうか?) 以上です、お願いします。