Visual Basic에서 구조체는 Structure 키워드를 사용하여 정의됩니다. 그들은:
MustInherit(추상)로 선언되거나 파이널라이저를 포함할 수 없습니다;Public Structure Point Public X As Integer Public Y As Integer Public Sub New(x As Integer, y As Integer) Me.X = x Me.Y = y End Sub End Structure Dim p1 As New Point(1, 2) Dim p2 = p1 ' 값이 복사됨, 참조 아님! p2.X = 5 ' p1.X = 1, p2.X = 5
Q: ByVal 및 ByRef로 함수를 호출할 때 구조체는 어떻게 작동하나요? 클래스와의 차이점은 무엇인가요?
A: 구조체를 ByVal로 전달하면 구조체의 전체 복사본이 생성됩니다. 함수 내의 변경사항은 원본에 영향을 주지 않습니다. ByRef로 전달 시, 원본 변수가 변경됩니다. 클래스는 비록 ByVal로 전달하더라도 참조가 전달되지만, 구조체는 ByVal로 완전히 복사되어 성능 및 동작에 영향을 주게 됩니다.
Sub MutateByVal(p As Point) p.X = 100 End Sub Sub MutateByRef(ByRef p As Point) p.X = 100 End Sub Dim s As New Point(3, 4) MutateByVal(s) ' s.X는 여전히 3 MutateByRef(s) ' s.X는 이제 100
역사
1. 대규모 라이브러리 프로젝트에서 구조체는 ByVal 인터페이스를 통해 대용량 데이터 배열을 전달하는 데 사용되었습니다. 이로 인해 스택에서 대용량 구조체가 여러 번 복사되어 성능이 저하되었습니다. 문제를 해결하기 위해 구조체를 불변 클래스으로 교체했습니다.
역사
2. GIS 개발 프로젝트에서는 참조 필드를 포함하는 구조체의 복사 시 혼란이 발생했습니다. 구조체 내의 배열을 수정하면서 개발자는 배열이 복사된 모든 곳에서 원본이 변경될 것이라고 예상하지 않았습니다, 비록 “값 유형”임에도 불구하고.
역사
3. 회계 소프트웨어에서 비즈니스 엔티티를 위해 구조체와 클래스를 혼합했습니다: 구조체에 대한 상속을 구현하려는 시도가 컴파일 오류로 끝났고, 시스템 아키텍처를 재조직해야 했으며, 구조체와 클래스 간의 잘못된 선택으로 인해 많은 비용이 소모되었습니다.