- PR -

VBでのWhile系のループの書き方

投稿者投稿内容
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2007-02-03 11:48
引用:

ぼのぼのさんの書き込み (2007-02-02 22:19) より:

VBの場合やっぱりこの書き方が一番一般的なのでしょうか?
ただ、ReadLine()を2ヶ所に書かなきゃいけないのと、sのスコープがループ内にならないのとありますよね。


ReadLine メソッドの戻り値で判定するという前提があると厳しいでしょうね。

引用:

これだとsのスコープもループ内になるしReadLineを書くのも1ヶ所だけ。
個人的にこの書き方結構好きなんですけど、世間一般には条件句のないDo〜Loopを嫌う人が結構いるんですよね。


Do ~ Loop という書き方が単に嫌いなだけの人もいますよね。
ほら、While という単語があった方がしっくり来る言語屋さんとかw
Do ~ While で末尾に後条件を書けば OK などという人もいますしww

個人的には、while などの繰り返し制御は、先頭行で抜ける条件が書いてあるのが望ましいと思います。

引用:

この理由がループ内でしか使わない変数のスコープがループ内でないことだとしたら、最初に挙げたC#のコードも一緒ですよね。


そういうことになるでしょうね。
最初にあった C# をあまり意識せずに出た一言でした。

ただ、

引用:

C#ならこの書き方が一番一般的かな〜と思ったんですが、そうでもないんでしょうか?


using の範囲は最小限に抑えるのが一般的なので、
結果、's' の有効範囲が while の外であっても、狭い範囲になりますよね。

あまり問題にはならないような気がしてきました。
このあたりは、本当に好みの次元ではないでしょうか。

引用:

ネストを浅くするために安直に使ってみたんですが、なんか問題ありますかね?(^_^;)
かるあさんの例みたいに同じモノを指定されることはさすがに考えてなかったんですが…


正常系として、Close メソッドを書きたくなった時のことを想定してみると良いかもしれません。
まあ、これは本題とは全然関係ない制御構造上のお話ですよ。

引用:

渋木宏明(ひどり)さんの書き込み (2007-02-03 00:22) より:

みたいに初期化しないと警告出ませんでしたっけ?
(直下で代入してるから出ないのかな?)


はい、代入するコードより前に '参照' されるようなコードを書いた時しか警告されません。

引用:

この s の初期化が無意味でイヤなので、個人的には

コード:

    for (string s = reader.ReadLine(); s != null; s = reader.ReadLine()) {


と書きます。


for は、先頭行で初期化・繰り返すための条件・繰り返す度に実行することが集約されている。
という美しい制御構文のひとつですから、今回のような場合に使うことは適切かもしれません。

しかし、人によっては、ループカウンタ系でないと違和感も感じる人が多い今日このごろ...
このあたりは、VB の For ステートメントの都合が絡んでいそうですが...

ここまで来ると、本当に好みとかポリシの問題だと思いますね。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
unibon
ぬし
会議室デビュー日: 2002/08/22
投稿数: 1532
お住まい・勤務地: 美人谷        良回答(20pt)
投稿日時: 2007-02-03 13:11
引用:

ぼのぼのさんの書き込み (2007-02-02 22:19) より:
でも、1回目のReadLineでいきなりNothingになることを考えると、後判定にはできないので、解決策としては

コード:

Do
    Dim s As String = reader.ReadLine()
    If s Is Nothing Then Exit Do
    If s.Trim().Length > 0 Then writer.WriteLine(s)
Loop


となります。これだとsのスコープもループ内になるしReadLineを書くのも1ヶ所だけ。
個人的にこの書き方結構好きなんですけど、世間一般には条件句のないDo〜Loopを嫌う人が結構いるんですよね。


私は VB.NET は使ったことがなく、VB や Excel の VBA は良く使うのですが、このスタイルが好きです。ループ中の好きなところで Exit を1回だけするのならば、それをためらわなくても良いと思います。Java や C# でもこれに似た書き方をすることが多いです。
(ただし、ひとつのループ中に複数の Exit があったりすれば、話は少し違ってくるかもしれません。)
渋木宏明(ひどり)
ぬし
会議室デビュー日: 2004/01/14
投稿数: 1155
お住まい・勤務地: 東京
投稿日時: 2007-02-03 13:18
引用:

個人的には、while などの繰り返し制御は、先頭行で抜ける条件が書いてあるのが望ましいと思います。



僕も条件は先に書いてある方が好きです。
do ~ while() の方が効率的な時は do ~ while() も使いますが、そう滅多に書かないですね。

引用:

for は、先頭行で初期化・繰り返すための条件・繰り返す度に実行することが集約されている。
という美しい制御構文のひとつですから、今回のような場合に使うことは適切かもしれません。



ループ開始行が長くなってしまうのが欠点かな。

引用:

しかし、人によっては、ループカウンタ系でないと違和感も感じる人が多い今日このごろ...
このあたりは、VB の For ステートメントの都合が絡んでいそうですが...



珍しく BASIC 系にしては自由度の低いところですね。

引用:

ここまで来ると、本当に好みとかポリシの問題だと思いますね。



そうですねぇ。自分がもしVBで書くとしたら Do ~ Loop のパターンかな。
ぼのぼの
ぬし
会議室デビュー日: 2004/09/16
投稿数: 544
投稿日時: 2007-02-04 01:12
引用:

unibonさんの書き込み (2007-02-03 13:11) より:
私は VB.NET は使ったことがなく、VB や Excel の VBA は良く使うのですが、このスタイルが好きです。ループ中の好きなところで Exit を1回だけするのならば、それをためらわなくても良いと思います。Java や C# でもこれに似た書き方をすることが多いです。


引用:

渋木宏明(ひどり)さんの書き込み (2007-02-03 13:18) より:
そうですねぇ。自分がもしVBで書くとしたら Do ~ Loop のパターンかな。


Do ~ Loop肯定派がいてなんか安心しました(^−^ )
貴重なご意見ありがとうございます。

引用:

unibonさんの書き込み (2007-02-03 13:11) より:
(ただし、ひとつのループ中に複数の Exit があったりすれば、話は少し違ってくるかもしれません。)


これはループ内の処理をサブルーチン化したときにReturn(Exit SubやExit Function)を複数書くことにも通じるお話ですね。
私の場合、If文のネストが深くなることがあまり好きでないので、いわゆるガード句的に、冒頭で複数のExitを書くことは、状況によってはあります。
#もちろん今回の例のような単純なケースではないですけど。
きくちゃん
ぬし
会議室デビュー日: 2003/08/01
投稿数: 854
お住まい・勤務地: 都内某所
投稿日時: 2007-02-05 10:01
#どうでも良い事ですが…。

引用:

じゃんぬねっとさんの書き込み (2007-02-03 11:48) より:
ここまで来ると、本当に好みとかポリシの問題だと思いますね。


私は Do While 〜 Loop / Do Until 〜 Loop 派です。

スキルアップ/キャリアアップ(JOB@IT)