- ベストアンサー
クラスの設定について
変数をクラスに設定するときのコードの書き方ですが、 sub プロシージャー名() dim m as クラス名 set m = new クラス名 ・・・・ end sub と sub プロシージャー名() dim m as new クラス名 ・・・・ end sub とかいても(簡単なプログラムでは)同じ働きをするのですが 違いはあるのでしょうか。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
[Aタイプ] As New Class1 [Bタイプ] As Class1 = New Class1 .NETであれば、どちらでもよいと思います。 .NETではないVBや、VBAでは、私個人としてはBタイプはお勧めしません。 あるメーリングリストの請負いなのですが、As New撲滅推進キャンペーンをしておりました。 (.NETがまだない時代からのメーリングリストです) Bタイプの Dim 変数 As New Class1 で Set 変数 = Nothing としても変数がNothingされず、再度「New Class1」がセットされるようです。 その結果、無駄にメモリを消費し続けるという状態になるようです。 しかし.NETからは、Nothingはされるので、どちらでもよいと思います。
その他の回答 (3)
- 1050 円(@1050YEN)
- ベストアンサー率69% (477/687)
#2です。 メーリングリストの内容を一部引用します。 Dim rs As New ADODB.Recordset の場合,rs が参照されるところではつねに If rs Is Nothing Then Set rs = New ADODB.Recordset End If というコードが暗黙のうちに挿入されているということになります。 結果毎回判定を行い、小規模のプロジェクトであれば気にする必要のレベルではないかも知れないけど、処理速度が遅くなってしまうという欠点があるそうです。 私の環境にVB6のMSDNがインストールされていないのですが、、、 上記のような発言をされた方は、MSDNの以下の項を読むように、言っておりました。 [Visual Studio 6.0 ドキュメント] └[Visual Basic ドキュメント] └[Visual Basic の使用方法] └[プログラミング ガイド] └[Visual Basic を使ってできること] └[各種のコンポーネントを利用したプログラミング] └[オブジェクトへの参照の作成方法] ├ : : └
- dsuekichi
- ベストアンサー率64% (171/265)
その変数に対するオブジェクトの生成を1回しかやらない(明示的にNothingを代入しない)なら、違いはほとんどありません。 「As New」を指定しない場合、一旦、その変数にNothingを設定してオブジェクトを破棄した後に、 再度その変数でオブジェクトを使用しようとした場合、もう一度 明示的に「= New」 を実行しなければなりません。 #そうしないとエラーになる。 「As New」を指定した場合、オブジェクトを破棄した後、 再度その変数でオブジェクトを使用しようとした場合、自動的に「New」が実行されます。 #その変数を再度アクセスしない限りNewは実行されません。 #便利な反面、オブジェクトの生成・破棄のタイミングが分かりにくくなります。
お礼
ありがとうございます。 クラスを複数回使う(通常は当たり前なのですが)この場合、As Newとすれば自動的に「New」が実行されるのなら dim m as new class1 の方がいいですね。 ただ、オブジェクトの生成・破棄のタイミングが分かりにくくなりますため一長一短があるということですね。
- tsukasa-12r
- ベストアンサー率65% (358/549)
違いはないと考えてよいです。 Dim m As New クラス名 の場合、実際にインスタンスが生成されるのは、最初に m が参照されるときですが、違いができるとすれば、インスタンスが生成されるタイミングくらいではないでしょうか。
お礼
ありがとうございます。setでインスタントを生成するか、dimでインスタントを生成するかの差なのですね。
お礼
ありがとうございます。 .NETであれば変わらないがVBの場合 最後にSet=Nothingで初期化?しますが、それができてなくメモリを食ってしまうのですね。