10

これがバグなのか機能なのかわかりませんでした

For i = 0 To 4
    Dim strTest As String
    If i = 0 Then
        strTest = "test value"
    End If
    Console.WriteLine(strTest)
Next

ループ内で文字列を宣言すると、その値が維持されないと思いましたが、このコードを実行すると、コンソールに「テスト値」が 5 行表示されます。代わりに、次のように strTest を宣言する場合:

Dim strTest As String= ""

次に、文字列はその値を維持しません。これは、関数が最初に動作することを期待していた方法です。

これはコンパイラによる意図的な動作ですか?

4

2 に答える 2

10

「設計通り壊れた」

http://msdn.microsoft.com/en-us/library/1t0wsc67.aspx

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

ここでの「ブロック」は、FOR ループの場合の本体であり、1 つの pr を入力しています。ループの繰り返し。そのため、strTest は最初の反復で設定された値 (「テスト値」) を次の反復 (1、2、3、4) で保持します。

于 2013-09-27T10:47:09.933 に答える