- ベストアンサー
コードの違いについて(VB2008)
お世話になっております。 最近、VB2008ExpressEditionの勉強を始めたのですが、まだ下記の違いが理解できていません。 (1) private sub hoge1() DataGridView1(0,0).Value = "TEST" end sub (2) private sub hoge2() dim dgv as DataGridView = DataGridView1 dgv(0,0).Value = "TEST" end sub (1)と(2)は同じ結果になりますが、ネットで色々なサンプルを見ると、(2)の書き方が多はなぜなのでしょうか。 同じ結果が得られるなら(1)の方が行数が少なくて良さそうに思えるのですが、(2)にする理由が分からないのです。 お恥ずかしい内容ですが、きちんと理解したいので、わかりやすい説明をいただけると大変ありがたいです。 よろしくお願いいたします。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
.NET系の言語は メモリはスタック領域とヒープ領域に分けて管理されています。 スタック領域にはヒープ領域へのポインタが格納されています。 int32(Integerまたはint)などの実数型はスタックにそのままの値が設定されます。 クラスなどは参照型であり、スタックにポインタを実態をヒープ領域に作成します。これをボックス化といいます。 (2)の dim dgv as DataGridView = DataGridView1 これをおこなうと、 スタック領域に dgv と DataGridView1 が存在しそれらがさす実態は DataGridView1の宣言時に作成されたデータとなります。 Object.ReferenceEquals(dgv, DataGridView1) を実行するとtrueが帰ってきます。 ここからがパフォーマンスについてです。 スタックに新たに領域を作成する手間の分だけ、 (2)のほうが時間がかかります。 しかし無視できる程度です。 何千・何万回も実行してみればさがわかると思います。 設定についてはまったく同じコストになります。 メモリ使用量についてです。 スタックにdgvを追加するのでその分が増えます。 おまけです、 クラスはボックス化されます、したがってByvalでわたしても、ByRefで渡しても、参照渡し扱いになります。
その他の回答 (1)
- dr-9
- ベストアンサー率47% (24/51)
自分も詳しくは無いですが、例えば「DataGridView1」に代入するものが100箇所位有ったとして、(1)だと「DataGridView1」から「DataGridView2」に変更した場合、100箇所同じ修正が必要です。 (キーワードの一括置き換えはリスクを伴います。) (2)だと一箇所の修正で済みます。 (1)はダイレクトに処理を記述している為、内容は解りやすいが応用が利かない。 (2)は間接的に処理を記述しているので内容は多少解りずらいが、応用が利く。 (2)が用いられる理由は、修正箇所をなるべく少なくし、バグを出しにくくする書き方している為です。
お礼
dr-9さま、ご回答ありがとうございます。 後々のメンテナンス性を考慮している、ということですね。 確かにおっしゃる通り、納得できました。 もう一点気になっているのは、パフォーマンスについてです。 例えば(1)より(2)の方が速度が速いとか、メモリ使用量が少ない、というような差はあるのでしょうか。 今の一般的なPCなら気にならないレベルかもしれませんが、5~6年前のPCでもアプリケーションを動作させる可能性があるもので、もしご存じでしたらお教えいただけると大変助かります。 質問を重ねてしまって心苦しいのですが、よろしくお願いいたします。
お礼
AKARI0418さま、詳細なご回答ありがとうございます。 お陰様でスッキリしました。 (2)の書き方の場合、スタック領域にポインタを作成するのでその分だけ時間とメモリを消費しますが、一般的なデータ入力用アプリケーションでは体感できるほどの差はなさそうですね。 後々のメンテナンスの事も考えると、やはり(2)で行くべきかと思います。 もしも(1)のようにプロシジャ内に「DataGridView1」と記述するのが1か所しかないようならば(1)でも良いという事ですね。 dr-9様、AKARI0418様、お陰様でモヤモヤが解消されました。 本当にありがとうございました。