VB.NET에서 공유 멤버 함수가있는 클래스 대신 모듈을 사용하는 것이 허용 가능한 방법으로 간주됩니까?
모듈은 Visual Basic 6.0에서 남은 것처럼 느껴지고 더 이상 적합하지 않기 때문에 모듈을 피하는 경향이 있습니다. 반면, 공유 멤버 만있는 모듈과 클래스를 사용하는 경우에는 큰 차이가없는 것 같습니다. 내가 정말로 많은 것을 필요로하는 것은 아니지만, 때로는 그들이 간단한 해결책을 제시하는 상황이 있습니다.
당신이 어떤 식 으로든 의견을 가지고 있는지 궁금합니다.
답변
Module
C # static
클래스에 대응하는 VB 입니다. 클래스가 헬퍼 함수 및 확장 메소드 전용으로 설계되었으며 상속 및 인스턴스화 를 허용 하지 않으 려면을 사용하십시오 .Module
그건 그렇고, 사용 Module
은 실제로 주관적 이지 않으며 더 이상 사용되지 않습니다 . 실제로 Module
적절한 경우 를 사용해야합니다 . .NET Framework 자체는 여러 번 수행합니다 ( System.Linq.Enumerable
예 :). 확장 메소드를 선언하려면 Module
s 를 사용해야 합니다.
답변
모듈을 별도의 네임 스페이스에 붙이지 않는 한 모듈을 피하는 것이 좋습니다. Intellisense에서 모듈의 네임 스페이스의 모든 위치에서 모듈의 메소드를 볼 수 있기 때문입니다.
따라서 대신 어디에서나 팝업으로 ModuleName.MyMethod()
끝나고 MyMethod()
캡슐화가 무효화됩니다. (적어도 프로그래밍 수준에서).
그렇기 때문에 항상 공유 메서드를 사용하여 클래스를 만들려고 시도하는 것이 훨씬 좋습니다.
답변
모듈은 더 이상 사용되지 않으며 VB 언어로 많이 사용됩니다. VB.Net에서 확장 메소드를 구현하는 유일한 방법입니다.
정적 멤버가있는 모듈과 클래스에는 큰 차이가 있습니다. 현재 네임 스페이스에서 모듈을 사용할 수있는 한 모듈에 정의 된 모든 메소드에 액세스 할 수 있습니다. 실제로 모듈을 사용하면 전역 메소드를 정의 할 수 있습니다. 공유 멤버 만있는 클래스는 수행 할 수없는 작업입니다.
다음은 원시 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
A를을Module
, - 의 인스턴스를 만들 수도 없습니다
Module
.
내부 뭐든지 Module
직접 내에서 액세스 할 수 있습니다 Module
을 참조하지 않고 조립 Module
이름으로. 기본적으로 a의 액세스 수준 Module
은 Friend
입니다.
답변
클래스
- 클래스는 객체 로 인스턴스화 될 수 있습니다
- 인스턴스화 된 각 개체마다 개체 데이터가 별도로 존재합니다.
- 클래스는 인터페이스 를 구현할 수 있습니다 .
- 클래스 내에 정의 된 멤버는 클래스 의 특정 인스턴스 내에서 범위 가 지정 되며 개체 수명 동안 만 존재 합니다 .
- 클래스 외부에서 클래스 멤버에 액세스하려면 Object.Member 형식의 완전한 이름 을 사용해야 합니다.
모듈
- 모듈 은 객체로 인스턴스화 할 수 없습니다 . 표준 모듈 데이터의 사본이 하나만 있기 때문에 프로그램의 한 부분이 표준 모듈의 공용 변수를 변경하면 전체 프로그램에서 볼 수 있습니다.
- 모듈 내에 선언 된 멤버는 기본적 으로 공개적으로 액세스 할 수 있습니다 .
- 모듈에 액세스 할 수있는 모든 코드로 액세스 할 수 있습니다.
- 즉, 표준 모듈의 변수는 프로젝트의 어느 곳에서나 볼 수 있고 프로그램 수명 동안 존재하기 때문에 효과적으로 전역 변수입니다.
답변
내 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
답변
모듈은 열거 형과 일부 전역 변수, 상수 및 공유 함수를 저장하는 데 적합합니다. 그것의 아주 좋은 것 그리고 나는 종종 그것을 사용합니다. 선언 된 변수는 전체 프로젝트에서 볼 수 있습니다.