SetとNothingの存在意味?

このQ&Aのポイント
  • セットとノーシングの意味について質問です。
  • 数値とオブジェクトの変数セットについて、それぞれの意味を教えてください。
  • オブジェクトの場合、インスタンスを生成しない単なる参照の場合にはNothingは不要なのでしょうか?
回答を見る
  • ベストアンサー

SetとNothingの存在意味?

数値とオブジェクトの変数セットはそれぞれ、 Dim num as integer num = 5 Dim obj as Object set obj = new From set obj = Nothing ですが、 オブジェクトの場合でインスタンスを生成しない、単なる参照?別名? の場合はNothingは不要でしょうか? Dim obj as Object For x = 1 to 10 set obj = Form2 ' newとインスタンスを生成するのではなく、単なる参照  obj.Caption = str(x) & "回目" 'set obj = nothingは不要? Next x

  • hdkoa
  • お礼率0% (1/117)

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

  • ベストアンサー
  • dsuekichi
  • ベストアンサー率64% (171/265)
回答No.1

生成したかどうかは、関係ないと思います。 オブジェクトは、「参照カウンタ」と言う情報を持っていて、 何かから参照される(例えば変数に設定されるとか)すると、 このカウンタが+1され、(Nothing等で)参照されなくなると、カウンタが-1されます。 で、カウンタが0になると「誰からも参照されていない」と言う事で、 破棄されます。 昔の古いVB(VB4だかVB5?)で、プロシージャが終了して、 ローカル変数が解放される際に、 この参照カウンタが-1されないと言うバグがあったため(VB6等では直ってます)、 確実にカウンタを-1するための、おまじないとして、明示的に > set obj = Nothing を実行する様になりました。 そういう意味で言うと、提示された状況では、 「ループの中で毎回実行する必要は無いにしても、 ループ終了後、1回実行しておいた方が良い」かも・・・ #無くても大丈夫だとは思いますけど・・・

関連するQ&A

  • このマクロの意味について教えてください。

    Sub Test() Dim wdObj As Word.Application Set wdObj = New Word.Application wdObj.Visible = True Set wdObj = Nothing End Sub で、ワードの空のアプリケーションを開けますが、 Set wdObj = Nothingの意味が分かりません。 Dim wdObj As Word.Applicationは変数の宣言 Set wdObj = New Word.Applicationは、インスタンスの生成 wdObj.Visible = Trueは、見えるようにする はわかるのですが、 Set wdObj = Nothingは何をしてるのですか? 調べたことろによると「オブジェクトの破棄」との事ですが 破棄されてる事を目で確認することはできないのでしょうか? タスクマネージャーのプロセスを見ると、 Set wdObj = New Word.Applicationを実行後に、 WINWORD.EXEが表示されることを確認できますが、 Set wdObj = Nothingを通過しても WINWORD.EXEは消えません。 そりゃアプリケーションが立ち上がってるからだと思いますが、 だったら何のために Set wdObj = Nothingはあるのでしょうか? 立ち上げたワードをバツボタンで閉じると タスクマネージャーのWINWORD.EXEは消えました。

  • 「参照の追加」で追加したCOMオブジェクトのエラーについて

    「参照の追加」で追加したCOMを、 DIM aa As New ~ Newでインスタンスを生成させたいのですが、エラーが発生して生成できません(--;) Try ~ Catchでエラーを調べた結果、 エラーコードは、「0x80040154」 メッセージは、「COMオブジェクトは有効でないか、登録されていません」 どうして、このエラーが発生するのかを教えて下さい m(_ _)m

  • VB6-オブジェクトを配列にセット

    質問用に、本来作りたいものではなく、機能に絞った質問をします。 ちなみにNo.2567628とは違います。 テキストボックスが10個あり、Text1、Text2、…Text10というオブジェクト名となります(説明の便宜上以上の名前になっているが実際はtxt○○で、○○の規則は無い)。仕様の都合上、text(1)、text(2)…の配列は使用できません。(配列のタイプはNo.2567628) 上記の仕様で、全てのテキストボックスをvbnullstringに割り当てたいのですが、 Private Sub Form_Load() Dim i As Integer Dim obj(9) As Object Set obj(0) = Text1 Set obj(1) = Text2 Set obj(2) = Text3 Set obj(3) = Text4     … Set obj(9) = Text10 For i = 0 To 10 obj(i).text = vbnullstring Doevents Next i End Sub で、本来出来るのですが、 Set obj(0) = Text1 の右辺がStringで定義したい場合ができません。 つまり Set obj(0) = "Text1" という感じです。 (本来のシステムなら"Text1"にあたる所が"strData"とかになる) Private Sub Form_Load() Dim i As Integer Dim obj(9) As Object Set obj(0) = "Text1"  'ここでエラー Set obj(1) = "Text2" Set obj(2) = "Text3" Set obj(3) = "Text4" Set obj(4) = "Text5" Set obj(5) = "Text6" Set obj(6) = "Text7" Set obj(7) = "Text8" Set obj(8) = "Text9" Set obj(9) = "Text10" For i = 0 To 9 obj(i).Text = vbNullString DoEvents Next i End Sub ちなみにエラーは「型が一致しません」です。 どこを直したらいいか教えてください。

  • VB6における事前バインディングの記述方法について

    VB6.0で、ActiveXコンポーネントのインスタンス生成に関連する質問をさせていただきます。 まず前提として、VB6.0では、 ExcelのようなActiveXコンポーネントをコード上で生成する場合、下記の4通りの記述が可能です。 -------------------------------------------- '(1) 参照設定は要らない Dim hoge As Object Set hoge = CreateObject("Foo.Bar") '(2) 参照設定が必要 Dim hoge As Foo.Bar Set hoge = CreateObject("Foo.Bar") '(3) 参照設定が必要 Dim hoge As Object Set hoge = New Foo.Bar '(4) 参照設定が必要 Dim hoge As Foo.Bar Set hoge = New Foo.Bar --------------------------------------------- この中で遅延バインディング(実行時バインディング)は(1)のみで、 (2)~(4)は事前バインディングです。 ここで疑問なのですが、開発者が事前バインディングでコーディングを行う場合、 (4)以外の記述(つまり、(2)と(3)の記述方法)にメリットや必要性はあるのでしょうか。 (2)はコード補完が使えなくなりますし、 (3)はレジストリ経由のせいでパフォーマンスが低下するでしょうし、 デメリットしかないように思われます。 そうであれば、これらの記述方法は推奨されないものなのでは、と思ったしだいです。 回答、よろしくお願いします。

  • javascriptを只今勉強中なのですが、オブジェクトについてこんが

    javascriptを只今勉強中なのですが、オブジェクトについてこんがらがってしまいました。 var obj = new Object(); var obj2 = {}; Object.prototype.prop1 = "hoge"; obj,obj2共にprop1にhogeがセットされるのですが、オブジェクトリテラルのobj2は Objectコンストラクタのインスタンスと解釈できるのでしょうか?? new演算子について色々とfirebugで調べていたところこの疑問が出てきました。 newなしでもインスタンスができるのでしょうか? オブジェクトを理解していないので意味不明な質問かもしれませんが どなたかアドバイスいただけると嬉しいです。

  • XmlReaderのnothing判定方法

    Dim rdr As XmlReader と宣言し 特定の条件が発生した時にrdrの値を入れるという処理を書いています。 ただ、 条件が発生しなかった場合はrdrのインスタンスは生成おらず、 これを判断するのにnothingだと比較出来ませんとエラーになります。 こういったケースの場合どのように判定してやるのでしょうか? 環境はVB2008です。

  • オブジェクトの廃棄

    VB6やC++の時はオブジェクトを使い終わったら破棄するのが当然でした。 Objsys=Nothingみたいな代入をよくやっていました。 VB.Netからはあまり意識されなくなっているのでしょうか。 インスタンスを生成してもそのままのことが多いような気がします? 例えば以下のgraphicsのインスタンスなどです。どうなっているのでしょう。 Dim g As Graphics = PictureBox1.CreateGraphics

  • SETを使ったほうがよい?

    accwessからエクセルファイルを開きたいのですが、 App.Workbooks.Open と、 Set xlBook = xlApp.Workbooks.Open とどちらを使った方がいいのでしょうか? ////////////////////////////////////////////////////////// Private Sub ファイル1_Click() Dim App As Object Dim MyFileName As String MyFileName = "D:\My Documents\test.xls" Set App = CreateObject("Excel.Application") App.Workbooks.Open FileName:=MyFileName App.Visible = True End Sub でも Private Sub ファイル2_Click() Dim xlApp As Object Dim xlBook As Object Dim FileName As String Const FolderName = "D:\My Documents\test.xls" Set xlApp = CreateObject("Excel.Application") Set xlBook = xlApp.Workbooks.Open(FolderName & FileName) xlApp.Visible = True Set xlApp = Nothing Set xlBook = Nothing End Sub ////////////////////////////////////////////////////////// でも開けました。 多分、SETを使うかどうかの違いだと思うのですが VBAでコードを作る際、どちらのコードを使った方がいいか教えてください。

  • php インスタンスとオブジェクトの呼び方

    new obj = new Test(); という一文は、 「Testクラスのオブジェクト、objを作成している」という考えを持っています。 オブジェクトは物という概念で、 「Testクラス を new して、objインスタンスを作成している」 というのが正しいのでしょうか? 【objを Testオブジェクトと呼ぶのは間違っているのでしょうか? objは Testインスタンスと呼ぶのがやはり正しいのでしょうか?】 知り合いにも、インスタンスではなくオブジェクトと呼んでる人が多いのでわからなくなってきました。 ご教授お願いします。

    • ベストアンサー
    • PHP
  • オブジェクトとインスタンスはそれぞれあってますか?

    オブジェクトとインスタンスはそれぞれあってますか? vbaで Sub test() Dim CN As ADODB.Connection 【1】 Set CN = New ADODB.Connection  【2】 ・・・ それぞれ 【1】オブジェクトの作成 【2】インスタンスの作成 であってますか?逆ですか? 動作の名称を教えてください。

専門家に質問してみよう