VB.NETでクラス静的をマークする


85

最近の質問回答で述べたように、静的クラスから継承することはできません。VB.NET内の静的クラスに付随するルールをどのように適用しますか?フレームワークはC#とVBの間で互換性があるため、クラスを静的としてマークする方法があることは理にかなっていますが、方法はないようです。

回答:


121

モジュール==静的クラス

継承できないクラスが必要な場合は、クラスを使用してくださいNotInheritable。ただし、静的/共有にはなりません。すべてのメソッド、プロパティ、およびメンバーをとしてマークすることもできますがShared、コンパイラーによって強制されないため、C#の静的クラスと厳密には同じではありません。

C#静的クラスと同等のVB.Netが本当に必要な場合は、を使用しModuleます。継承することはできず、すべてのメンバー、プロパティ、およびメソッドは静的/共有されます。


2
以前のコメントを撤回します。私はリフレクターのモジュールを見ていましたが、ILはそれを密閉されていると示しています。
MagicKat 2008

27
あなたはVBerですか?モジュールは名前空間のようなものです。すべてのVB関数はVBのモジュールからインポートされ、一般的なスコープで使用できます。私の意見では、vbの静的クラスはモジュールではなく、動作が異なります。vbで「静的クラス」の動作が必要な場合は、NotInheritableを使用して、C#の静的クラスで行う必要があるのと同じように、すべてのメンバーを「共有」として宣言する必要があります。これらは同じように動作します。モジュールではありません。
シミーワイツハンドラー2010

2
@Shimmy以前にこのコメントを見逃した理由はわかりませんが、あなたは間違っています。生成されたILを見ると、モジュールは静的クラスとまったく同じ扱いを受けます。VBは、古い標準関数をグローバルスコープに表示するために追加の作業を行うだけです。
Joel Coehoorn 2013

2
モジュールは名前空間で直接宣言する必要があるため、@ JoelCoehoornモジュール≈≈静的クラス。これは、モジュールまたはクラスでモジュールを宣言できないことを意味します。
ロスマノス2014年

20
@JoelCoehoornモジュールと静的クラスが同じILで終わるという事実は知っておくとよいですが、VBはさらにモジュールのメンバーをそれを含む名前空間に昇格させます。推進モジュールと静的クラスは巨大な違いだ実用化し、私見では異なる場合態様です。私はNotInheritable(空のプライベートコンストラクター)をはるかに好みます。メンバーはクラスを介してのみ到達できるため、すべてのメンバーがソリューションを共有します。静的クラスの同等性を取得しようとしている場合は、はるかに正しい動作です。ILは異なるかもしれませんが、それは本当に学術的です。
misha256 2014

51

もうすぐです。インスタンス化も防止する必要があります。

NotInheritable Class MyStaticClass

    ''' <summary>
    ''' Prevent instantiation.
    ''' </summary>
    Private Sub New()

    End Sub

    Public Shared Function MyMethod() As String

    End Function

End Class
  • Sharedは静的クラスのメソッドのようなものです。
  • NotInheritableは封印されたようなものです。
  • Private Newは、静的クラスをインスタンス化できないようなものです。

参照:
MSDN-静的クラスと静的クラスメンバー


2
なぜこれは受け入れられた答えではないのですか?コードスニップをありがとう
ArcherBird

6

継承できないクラスを作成したいだけの場合は、C#ではSealedを使用でき、VB.NetではNotInheritableを使用できます。

静的に相当するVB.Netが共有されます。


C#静的クラスで行う必要があるのと同じように、変数と機能を共有としてマークします。NotInheritableとしてマークすると、封印されます。
シミーワイツハンドラー2010

5

vb.netで静的クラスを作成できます。解決策は

Friend NotInheritable Class DB
    Public Shared AGE As Integer = 20
End Class

AGE変数はpublicstaticであり、このように他のコードで使用できます

 Dim myage As Integer = DB.AGE

Friend = public、NotInheritable = static


3
Friend!= public、Friend = internal
Altair

1
NotInheritable!=静的、NotInheritable ==封印
Magnus

!myage = 20(これ以上、悲しいことに)
グリム

2

CLRの観点からは、C#静的クラスは単に「封印された」「抽象」クラスです。インスタンスは抽象的であるため作成できず、封印されているため継承できません。残りはコンパイラの魔法です。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.