回答:
Modulesは、C#staticクラスに対応するVB です。クラスがヘルパー関数と拡張メソッド専用に設計されており、継承とインスタンス化を許可したくない場合は、を使用します。Module
ところで、使用Moduleは本当に主観的ではなく、非推奨ではありません。実際、Module適切な場合はaを使用する必要があります。.NET Framework自体はそれを何度も実行System.Linq.Enumerableします(たとえば)。拡張メソッドを宣言するには、Modules を使用する必要があります。
モジュールを別々の名前空間に貼り付けない限り、モジュールを避け続けることは良い考えだと思います。Intellisenseでは、モジュールのメソッドはその名前空間のどこからでも見えるからです。
したがって、どこかにポップアップが表示ModuleName.MyMethod()される代わりにMyMethod()、この種のカプセル化が無効になります。(少なくともプログラミングレベルでは)。
そのため、私は常に共有メソッドを使用してクラスを作成しようとしますが、はるかに優れているようです。
モジュールは決して非推奨ではなく、VB言語で頻繁に使用されます。これは、たとえばVB.Netで拡張メソッドを実装する唯一の方法です。
静的メンバーを持つモジュールとクラスの間には1つの大きな違いがあります。モジュールが現在の名前空間で使用できる限り、モジュールで定義されたメソッドはすべてグローバルにアクセスできます。実際には、モジュールを使用すると、グローバルメソッドを定義できます。これは、共有メンバーだけのクラスではできないことです。
これは、生のCOMインターフェイスと相互運用するVBコードを記述するときによく使用する簡単な例です。
Module Interop
Public Function Succeeded(ByVal hr as Integer) As Boolean
...
End Function
Public Function Failed(ByVal hr As Integer) As Boolean
...
End Function
End Module
Class SomeClass
Sub Foo()
Dim hr = CallSomeHrMethod()
if Succeeded(hr) then
..
End If
End Sub
End Class
使用しても問題ありませんModule。Moduleの代わりとしては使用されませんClass。Module独自の目的を果たします。の目的はModule、コンテナとして使用することです
Class、またはClass。Module以下のようではありませんClassので、あなたがすることはできません
Module、InterfaceしModule、Module。内部のものはModule直接内でアクセスすることができるModuleを参照することなく組み立てModuleその名前によって。デフォルトでは、aのアクセスレベルModuleはFriendです。
クラス
モジュール
私のVB.NETクラスの1つにすべての共有メンバーがある場合、それを一致する(または適切な)名前空間を持つモジュールに変換するか、クラスを継承不可能および構築不可能にします。
Public NotInheritable Class MyClass1
Private Sub New()
'Contains only shared members.
'Private constructor means the class cannot be instantiated.
End Sub
End Class
Imports <whatever>あなたは任意の輸入を持っている場合は、Namespace MyCoolModule、Public Module MyCoolModule、<メンバーせずに Shared、> End Module、End Namespace。
Extensionメソッドを作成する場合は、クラスではなくモジュールを使用する必要があります。VB.NETでは、別のオプションを認識していません。
私自身もモジュールに耐性があるため、埋め込みSub New()モジュールを1つに解決するためのボイラープレートコードを追加する方法を試すために数時間を費やしましたが、(モジュール)とShared Sub New()(クラス)が同等であることがわかりました。(モジュールにcallable があることさえ知りませんでしたSub New()!)
だから、僕は投げEmbeddedAssembly.LoadとAddHandler AppDomain.CurrentDomain.AssemblyResolveそこにラインを、ボブは私の叔父となりました。
補遺:私はまだ100%チェックアウトしていませんがSub New()、モジュール内でクラスとは異なる順序で実行されるインクリングがあります。これは、いくつかの宣言を外側から内側のメソッドに移動しなければならなかったという事実です。エラー。
Private。つまり、修飾子を明示的に追加し忘れた場合、誤ってメソッドを使用できるようになる可能性があります。クラスでは、デフォルトの保護レベルはプライベートであり、これを意識していないと混乱を招く可能性があります。