3

次のコードを検討してください。

For i As Integer = 0 To 10
   Dim str As String = str & " Kratika "
Next

デバッガーをアタッチしてstratの値を確認するとi = 10、次のように表示されます。

 Kratika  Kratika  Kratika  Kratika  Kratika  Kratika  Kratika  Kratika  Kratika  Kratika  Kratika 

前の値を連結するのはなぜですか? 毎回新しい String オブジェクトを宣言するので、変数はkratika毎回 に設定されると思いますよね?

4

2 に答える 2

4

これは予想される動作です。

別の回答へのコメントで言及しているように、文字列の連結よりも整数を使用した方がおそらく見やすいでしょう。

Sub Main()
  For i As Integer = 0 To 5
     Dim j As Integer = j + 1
     Console.WriteLine(j.ToString())
  Next
End Sub

出力は次のとおりです。

1
2
3
4
5
6

その理由を知るために、ドキュメント、特にスコープのセクションに目を向けます。宣言したj変数は、ブロック内で宣言されているため、ブロックスコープにありForます。ただし、ブロックスコープで宣言された変数は、それを含むプロシージャの期間全体にわたって値を保持します。ドキュメントがメモで述べているように:

変数のスコープがブロックに制限されている場合でも、その存続期間はプロシージャ全体の存続期間です。手順中にブロックに複数回入力した場合、各ブロック変数は以前の値を保持します。このような場合の予期しない結果を回避するには、ブロックの先頭でブロック変数を初期化することをお勧めします。

Forつまり、ブロックに再度入るたびにj、以前の値が残っているということです。等号の右側が最初に評価されるため、その古い値はj1ずつ増加し、次にに格納されますj(実質的にの古い内容を消去しjます)。

于 2013-02-08T05:49:15.760 に答える
0

こんにちは、ループ内で使用しています。毎回str & " Kratika "のみを期待する場合 は、ループ内でのみ使用してください。" Kratika "Dim str As String = " Kratika "

今もう一度チェック

于 2013-02-08T05:19:05.507 に答える