2012-03-13 4 views
2

VB.Netのローカル変数のキーワードであるStaticがほとんど使用されていませんでした。私の質問はではなく、の静的な動作についてです(私は個人的には、それが副作用に気付かない将来のプログラマーに悲嘆を引き起こす可能性があるように私は個人的にそれを使用することを避ける予定です)。私の質問は、MSDNのドキュメントに誤りがありますか? "プロシージャがSharedの場合、そのローカル変数はすべて自動的に共有されます。これにはStatic変数も含まれます。"

任意のローカル変数の振る舞いは、それが共有の手順で 宣言されているかどうかに依存します。手順が共有の場合、そのローカルの 変数はすべて自動的に共有されます。これには、変数 が含まれます。そのような変数のコピーは、 アプリケーション全体に対して1つしかありません。

これは、共有サブ内のすべてのローカル変数は静的変数のように振る舞うことを意味するようだ - 彼らは別々の呼び出しにわたってその値を保持します。しかし、私はこれがそうでないことを知っていた、と私はそれを証明するために少しテストプログラムを書いた:

Class TestSharedSub 

    Shared Sub Main() 
     Test() 
     Test() 
     Test() 
     Console.Write("Press any key to continue...") : Console.ReadKey() 
     ' Output: 
     ' 1, 1 
     ' 2, 1 
     ' 3, 1 
    End Sub 

    Shared Sub Test() 
     Dim iNormal As Integer 
     Static iStatic As Integer 
     iNormal += 1 
     iStatic += 1 
     Console.WriteLine(iStatic & ", " & iNormal) 
    End Sub 

End Class 

だから、誰もが理にかなっている方法で、私のために上記の文を解釈することができますか?これはドキュメントのバグですか?それは、2005年のバージョンのドキュメント以来存在しており、Visual Studio 11バージョンにはまだ存在しています。

答えて

3

いいえ、それはナンセンスです。

プロシージャがSharedでない場合、そのローカル変数はインスタンス変数です。

ローカル変数は、ページがすべてのローカル変数を理解することがないように見えることを書いた人は誰でも

...インスタンス変数ではありません。善良な人は再帰について何をするのかを知っています。それが合理的をオフに開始し、断っておく:

通常、プロシージャ内のローカル変数は、プロシージャが停止するとすぐに存在しなくなります。

...しかし、このステートメントは、後のステートメントとは明らかに矛盾しています。 Sigh。

Connectにバグを報告することをお勧めします。

3

その特定のドキュメントは間違っています。 Sharedメソッドで宣言されたローカル変数は、非共有メソッドで宣言されたローカル変数と変わりません。地元の人々の唯一の行動の違いは、Static修飾子で宣言されていることにあります。

私はそれについて適切なチームに警告します。ドキュメントの担当

EDIT

チームが警告された、非常に近い将来にドキュメントを修正します。

+0

ありがとう、Jared!彼があなたの前にほんの数分しかいないので、私はジョンに答えてくれました。しかし、私はあなたに私の言葉を入れていただきありがとうございます。私はまだボールを動かすためにConnectにバグレポートを提出するつもりだと思う:https://connect.microsoft.com/VisualStudio/feedback/details/730944/msdn-documentation-error-if-the-procedure-is -shared-all-its-local-variablesは自動的に共有されます。これは静的変数を含みます。 –

+0

@JordanRieger私は私が知る追加情報で私の答えを編集します。 – JaredPar

+0

彼らはVS 2012および2012のドキュメントを更新しましたが、2008または2005は更新しませんでした。Connectのバグレポートに、2008年と2005年のドキュメントを修正するように要請する別のコメントを投稿しました。 –

関連する問題