変数を使用する時は?

解決


まいまい  2004-11-25 10:54:15  No: 86874  IP: [192.*.*.*]

ごくごく初歩的なことを質問します。

Private Sub Command1_Click()
  With Text1
    .Text = "初歩的"
    .Enabled = True
  End With
End Sub

とする場合もあれば

Private Sub Command1_Click()
Dim strString As String
  With Text1
    strString = "初歩的"
    .Text = strString
    .Enabled = True
  End With
End Sub

としているサンプルもあります。長いことVBをやっていますが目からうろこというか思いもしなかったことで、考えています。変数を使うべきときはどんな時が適切なのでしょうか?上記の例ではどちらでもいいと思うのですが、変数を当てるほうがいいのでしょうか?アプリケーションの処理速度に関わってくることで意外とナーバスになっているのかも知れません。

編集 削除
java.lang.Nullpo  2004-11-25 11:11:31  No: 86875  IP: [192.*.*.*]

プロパティを複数呼び出すのを嫌って、変数へ格納して使う分には有効ですが・・・

編集 削除
nanashi  2004-11-25 11:17:15  No: 86876  IP: [192.*.*.*]

> 変数を使うべきときはどんな時が適切なのでしょうか?

自分が必要だと思ったときで良いんじゃないかと思います。
あまりナーバスになってもねェ……。

ちなみに上記の例の場合、私の環境で500万回実行したところ
変数なしでは7.3秒、変数使用では7.9秒くらいの差しか出ませんでした。

処理速度のことを考えるなら↓のサイトの『VBコーディング標準』ってところを一読することをおすすめします。
http://www.gj.il24.net/~nakasima/index.html

編集 削除
nah  2004-11-25 11:28:51  No: 86877  IP: [192.*.*.*]

私は経験上、なるべく直書きを避けています。
なぜなら今後の修正上で大変になるからです。
変数はなるべくスコープを小さく、無駄に宣言しない方が勿論
メモリの無駄遣いをなくす事になりますが、左程処理速度を気にせず
作れる際は、変数を使用した方がよい場合が(上記サンプルのようなものは)多いのではと思います。
修正が入った時・・直書きより修正が楽(複数あったり探しづらかったり)
他の人が見る時・・例えば1と書くより、blnTrueと書いた方が分かり易い。
↑(プログラミングの基礎で結構重要です。)
等々を踏まえて作る物に見合った使い方が大切だと思います。

編集 削除
まいまい  2004-11-25 11:29:37  No: 86878  IP: [192.*.*.*]

さっそくのご回答恐れ入ります。処理速度に関してはページを拝見しまして了解しました。メモリに関してはどうなのでしょうか?
フレキシブルグリッドのTextmatrixプロパティでは直接代入するよりも変数に格納して当てたほうが早いというような記事を見たことがあるのですが。もちろんおういうことって明確に決まったものではないでしょうが。

編集 削除
まいまい  2004-11-25 11:38:23  No: 86879  IP: [192.*.*.*]

java.lang.Nullpoさん、nahさん、nanashiさん、ありがとうございます。
もうひとつ疑問なのですが、宣言して、1度使用して、使わなくなった変数を使いまわすことってしてますか?
自分のプログラミングスタイルは、同一名の変数(配列宣言)を使用し、異名の変数を減らすところにあります。おかしい使い方だとは思いますが、半分見易さ、半分見にくさもあります。

編集 削除
まいまい  2004-11-25 11:39:56  No: 86880  IP: [192.*.*.*]

この場合というのは1度使って使わなくなった変数のメモリはそのまま残るのでしょうか?

編集 削除
java.lang.Nullpo  2004-11-25 12:07:27  No: 86881  IP: [192.*.*.*]

> 使わなくなった変数を使いまわすことってしてますか
ループカウンタなどで多く見受けられますが、
同じ変数を使いまわすことは、コンパイラで最適化されなくなる温床になります。

> この場合というのは1度使って使わなくなった変数のメモリはそのまま残るのでしょうか?
スコープの範囲によるでしょう。

編集 削除
java.lang.Nullpo  2004-11-25 12:11:13  No: 86882  IP: [192.*.*.*]

それはともかく、体感速度がさほど変わらないのなら、
可読性を重視すべきという意見には賛成です。

> プロパティを複数呼び出すのを嫌って、変数へ格納して使う分には有効ですが・・・

と言ったのは、速度だけを考えた場合の話です。
微妙な速度アップはありますから。

編集 削除
まいまい  2004-11-25 12:11:40  No: 86883  IP: [192.*.*.*]

>ループカウンタなどで多く見受けられますが、
>同じ変数を使いまわすことは、コンパイラで最適化されなくなる温床になります。

これは知りませんでした。ありがとうございます。

変数を使用したあとにメモリを開放する、例えば Set objObject = Nothing みたいなものっていうのはあるのでしょうか?strFileName = vbNull とか。

編集 削除
まいまい  2004-11-25 12:12:28  No: 86884  IP: [192.*.*.*]

>それはともかく、体感速度がさほど変わらないのなら、
>可読性を重視すべきという意見には賛成です。

はい。この点重視します。

編集 削除
GG  2004-11-25 12:19:55  No: 86885  IP: [192.*.*.*]

思いついたことを質問するんじゃなくて調べて分からないところを
聞いたほうがいいですよ。

編集 削除
まいまい  2004-11-25 12:21:04  No: 86886  IP: [192.*.*.*]

GGさん、恐れ入ります。申し訳ありません。注意します。

編集 削除
java.lang.Nullpo  2004-11-25 15:02:18  No: 86887  IP: [192.*.*.*]

オブジェクト型と、そうでない型の違いを勉強した方が良いかな。

# VB.NETだったら、すべてオブジェクト型の派生だけど。

編集 削除
まいまい  2004-11-26 07:38:36  No: 86888  IP: [192.*.*.*]

はい、皆さんありがとうございます。もう少し勉強してみます。

編集 削除