sourcetip

클래스 vsVB 모듈그물

fileupload 2023. 4. 8. 09:10
반응형

클래스 vsVB 모듈그물

VB에서 공유 멤버 기능을 가진 클래스가 아닌 모듈을 사용하는 것이 허용 가능한 관행으로 간주됩니까?인터넷?

모듈은 Visual Basic 6.0의 잔여물처럼 느껴져 더 이상 적합하지 않게 느껴지기 때문에 피하는 경향이 있습니다.반면 공유 멤버만 있는 모듈과 클래스를 사용하는 것은 큰 차이가 없는 것 같습니다.저도 그다지 필요로 하는 것은 아니지만, 때때로 간단한 해결책을 제시하는 경우가 있습니다.

어떤 의견이나 취향이 있는지 궁금하네요.

Module는, C# 「C#」 「에하고 있습니다.static반.클래스가 도우미 기능 및 확장 메서드 전용으로 설계되어 상속 및 인스턴스화허용하지 않을 경우Module.

런데, using using using를 Module주관적이지도 않고 비호감적이지도 않습니다.확실히, 사용하실 필요가 있습니다.Module번 (NET Framework)System.Linq.Enumerable하려면 확장 방식을 사용해야 .Modules.

모듈을 다른 네임스페이스에 삽입하지 않는 한 피하는 것이 좋다고 생각합니다.인텔리센스에서는 모듈의 메서드가 네임스페이스의 모든 곳에서 표시되기 때문입니다.

★★★★★★★★★★★★★★★★★★★ModuleName.MyMethod() 해서 '이렇게 되다'가 됩니다.MyMethod()에서는)(일본어판/영어)

그래서 저는 항상 공유 방식의 클래스를 만들려고 노력합니다. 훨씬 더 나은 것 같습니다.

모듈은 결코 권장되지 않으며 VB 언어로 많이 사용됩니다.예를 들어 VB에서 확장 방식을 구현하는 유일한 방법입니다.그물.

정적 멤버를 가진 모듈과 클래스 사이에는 하나의 큰 차이가 있습니다.모듈에 정의된 모든 방법은 모듈이 현재 네임스페이스에서 사용 가능한 한 글로벌하게 액세스할 수 있습니다.실제로는 모듈을 사용하여 글로벌 메서드를 정의할 수 있습니다.이것은 공유 멤버만 있는 클래스는 할 수 없는 것입니다.

다음은 원시 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

합니다.ModuleModule를 대체하기 위해 사용되지 않습니다.ClassModule그 나름의 목적에 부합합니다.★★★의 Module입니다.

  • 확장 메서드,
  • 하지 않은 Class 「」
  • 변수에도 않는 Class.

ModuleClass 수 없기

  • 을 받다Module ,
  • Interface a Module ,
  • 의 인스턴스를 생성하지 않습니다.Module.

の a a の a a の a a の a a a a の a a 。Module 접속할 수 .Module를 합니다.Module액세스레벨입니다ModuleFriend.

  • 클래스는 오브젝트로 인스턴스화할 수 있습니다.
  • 인스턴스화된 각 개체에 대해 개체 데이터가 별도로 존재합니다.
  • 클래스는 인터페이스를 구현할 수 있습니다.
  • 클래스 내에서 정의된 멤버는 클래스의 특정 인스턴스 내에서 범위가 지정되며 개체의 라이프타임 동안만 존재합니다.
  • 클래스 외부에서 클래스 멤버에 액세스하려면 개체 형식정규화된 이름을 사용해야 합니다.멤버.

모듈

  • 모듈은 객체로 인스턴스화할 수 없습니다.표준 모듈의 데이터 복사본은 1개뿐이기 때문에 프로그램의 일부가 표준 모듈의 공용 변수를 변경하면 전체 프로그램에서 볼 수 있습니다.
  • 모듈 내에서 선언된 멤버는 기본적으로는 공개적으로 액세스할 수 있습니다.
  • 모듈에 액세스할 수 있는 모든 코드로 액세스할 수 있습니다.
  • 즉, 표준 모듈의 변수는 프로젝트의 모든 위치에서 볼 수 있고 프로그램 수명 동안 존재하기 때문에 사실상 전역 변수입니다.

내 VB 중 한 명일 때.NET 클래스는 모든 공유 멤버를 가지고 있습니다.일치하는(또는 적절한) 네임스페이스를 가진 모듈로 변환하거나 클래스를 상속할 수 없고 구성 가능하지 않게 합니다.

Public NotInheritable Class MyClass1

   Private Sub New()
      'Contains only shared members.
      'Private constructor means the class cannot be instantiated.
   End Sub

End Class

모듈은 Enum 및 일부 글로벌 변수, 상수 및 공유 함수를 저장하는 데 적합합니다.그것은 매우 좋은 것이고 나는 그것을 자주 사용한다.선언된 변수는 전체 프로젝트에서 볼 수 있습니다.

확장 메서드를 만드는 경우 클래스가 아닌 모듈을 사용해야 합니다.VB.NET에서는 다른 옵션이 없습니다.

이 있기 에 임베디드 하기 위해 코드를 몇 시간 을 보냈을 인데, '모듈'은 '모듈'에 대한 내성이라는 것을 되었습니다.Sub New()(모듈) 및Shared Sub New()(클래스)는 동등합니다.(콜 가능 여부도 몰랐습니다)Sub New()모듈 내)

그래서 그냥 던졌어요.EmbeddedAssembly.Load그리고.AddHandler AppDomain.CurrentDomain.AssemblyResolve밥은 삼촌이 됐어요

부록:아직 100% 확인은 안 했는데 뭔가 눈치채고 있어요.Sub New()는 클래스와는 다른 순서로 모듈 내에서 실행됩니다.오류를 피하기 위해 일부 선언을 외부에서 내부 메서드로 이동해야 했습니다.

언급URL : https://stackoverflow.com/questions/881570/classes-vs-modules-in-vb-net

반응형