8

staticキーワードについて。

この時点まで、私自身の調査を通じて、staticキーワードが何であるかについての一般的な考えを持っていますが、これらすべての異なる説明と詳細は、私をさらに混乱させるだけだと感じています. 現時点では、「 」の適切な使用方法を知っているとは本当に思いませんstatic。C# と VB.NET では使用方法が異なるようで、使用目的に応じて言語内で適用方法が異なります。</p>

MSDN の記事Static (Visual Basic)を読んでいるときに、特に次の文を読んだときに、多くの疑問が生じました。

通常、プロシージャ内のローカル変数は、プロシージャが終了するとすぐに存在しなくなります。static変数は存在し続け、最新の値を保持します。

  1. VB.NET のバージョンはstaticC# や Java と同じですか? 概念はほとんどの言語で同じですか?

  2. クラス内に値staticを保持し、クラスをインスタンス化せずにその特定のメンバー、関数にアクセスできる場合、これは大まかに使用しても安全ですか? 言い換えれば、staticクラス内で 's を使用するときは注意深く監視する必要がありますか? なぜかグローバル変数を思い出します。多分私はここで無知であり、彼らの目的を理解するためにもっと練習が必要です.

  3. static使用することでコードの再利用性が向上し、促進される良いシナリオは何ですか?

4

3 に答える 3

9

C# では、キーワードはVB.NETのキーワードstaticと同じです。つまり、静的クラスと静的クラス メンバー (C# プログラミング ガイド)から:shared

静的クラスとクラス メンバーは、クラスのインスタンスを作成せずにアクセスできるデータと関数を作成するために使用されます。

VB.NETでは、型ではなく変数に適用されるためstatic、動作が大きく異なります。

この動作に相当する C# があるかどうかはわかりません。

1) static の VB.NET バージョンは C# または Java と同じですか? また、ほとんどの言語で概念は同じですか?

違います。sharedは同じですが。

2) static がクラス内で値を保持し、その特定のメンバーにアクセスできる場合、クラスをインスタンス化せずに機能します – これは緩く使用しても安全ですか? 言い換えれば、クラス内で static を使用するときは注意深く監視する必要がありますか? 何らかの理由でグローバル変数を思い出させます。おそらく、私はここで無知であり、それらの目的を理解するにはもっと練習が必要です。

非常に注意してください。これらはアプリケーション ドメインに対してグローバルです。

3)静的な利点を使用してコードの再利用性を促進する良いシナリオは何ですか?

一例として、静的リストを使用して、ドロップダウン リストの入力に使用されるデータ セットをキャッシュし、 SQL Serverにアクセスし続ける必要がないようにします。

于 2012-07-24T14:24:28.613 に答える
6

他の回答は静的のC#の使用法を扱っていたのでStatic、MSDNの記事を参照したのでVB.NETで話します。VB.NET で Static ローカル変数を作成すると、コンパイラはそれをクラス レベルの変数に変換します。この変数は、変数がコードで宣言されている関数内のコードによってのみ参照できます。上記の変数がインスタンスであるか共有であるかは、含まれている関数によって異なります。たとえば、次のコード:

Public Class StaticTest

    Public Function Process(value As Integer) As Integer
        Static lastValue As Integer
        Dim result As Integer
        If value > 0 Then
            result = value
            lastValue = value
        Else
            result = lastValue
        End If
        Return result
    End Function

End Class

次のようなものに逆コンパイルします。

Public Class StaticTest
    ' Methods
    <DebuggerNonUserCode> _
    Public Sub New()
    End Sub

    Public Function Process(ByVal value As Integer) As Integer
        If (value > 0) Then
            Dim result As Integer = value
            Me.$STATIC$Process$20188$lastValue = value
            Return result
        End If
       Return Me.$STATIC$Process$20188$lastValue
    End Function

    ' Fields
    Private $STATIC$Process$20188$lastValue As Integer
End Class

lastValue関数への入り口で を設定するvalueと、コンパイラはある種の初期化コードと追加のフィールドも作成することに気付きました。そのため、ローカルでStatic追加のコードが生成される場合があります。

ローカル変数の使用は避けることをお勧めしStaticます。実際にクラスレベルのインスタンス変数を宣言する別の方法と比較すると、ローカル変数の方が混乱しやすく、役立つからです。Statics のトレードオフは次のとおりです。

為に:

  • 別の機能ではアクセスできません

に対して:

  • コンストラクターで初期化することはできません (ただし、上記の追加の初期化フィールド/コードを提供する宣言でインラインで初期化できます)
  • コード内のクラス ローカルの典型的な配置に従って配置できない
  • 地元の人のように見えますが、そうではありません
于 2012-07-24T16:19:47.517 に答える
5
  1. VB.NETsharedは C# と同じですstatic。C#staticは、Java やその他のほとんどの言語の static とほとんど同じです。コンセプトは引き継がれます。
  2. これはイエスかノーかの質問です。static自分が何をしているのかわからないまま、ランダムに s を放り投げたくはありません。ただし、それらは多くの状況で役立ちます (これについては #3 で詳しく説明します)。それらはまだ「名前空間」があり、所属するクラスによって編成されているため、実際にはグローバル変数とは異なります。
  3. 静的メンバーは通常、ユーティリティ メソッドとクラスに使用されます。たとえば、C# は Math ライブラリのほとんどを静的メソッドとして実装します。これは、計算を行うだけで、他の副作用がないためです。原則として、メソッドに副作用がなく、ジョブを実行するために必要なすべてのデータがパラメーターとして渡される場合。クラスのインスタンス間で一部のデータを共有する場合は、静的プロパティを使用することもできます (たとえば、特定のメソッドが呼び出された回数を追跡するなど)。静的には、使用ごとに新しいコピーを作成するのではなく、アプリケーション全体で共有するクラスまたはメソッドのインスタンスを 1 つだけ作成できるため、メモリ使用の利点もあります。拡張メソッドにも静的クラスを使用しますが、それはまったく別の議論です。
  4. 具体的には尋ねていませんが、欠点について言及する価値があります。static を回避する最大の理由は保守性です。静的クラスを簡単に継承または拡張することはできません。これは、考慮すべき重要なことです。継承よりも合成のルールに固執している限り、これは必ずしも問題ではありませんが、静的クラスの継承とポリモーフィズムの欠如は大きな欠点です。この 1 つの問題だけでも、多くの人があらゆる場合に静電気を避けることを提案するようになります。
于 2012-07-24T14:36:17.377 に答える