Visual Basic'de yapılar Structure anahtar kelimesi ile tanımlanır. Onlar:
MustInherit (soyut) olarak ilan edilemezler ya da finalizörler içermemelidir;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 ' Değer kopyalanır, referans değil! p2.X = 5 ' p1.X = 1, p2.X = 5
S: Yapı bir fonksiyona ByVal ve ByRef ile geçirildiğinde ne olur? Sınıfın geçişinden farkı nedir?
C: Yapı ByVal ile geçirildiğinde, yapıların tümünün bir kopyası oluşturulur. Fonksiyondaki değişiklikler orijinal nesneyi etkilemez. ByRef ile ise, orijinal değişken değiştirilir. Sınıflar ise herhangi bir geçişte (hatta ByVal ile) referans geçirir, yapılar ByVal ile tamamen kopyalanır; bu performans ve davranışı etkiler.
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 hala 3 MutateByRef(s) ' s.X artık 100
Hikaye
1. Büyük bir kütüphane projesinde, yapılar, ByVal arayüzü ile büyük veri dizileri göndermek için kullanıldı. Bu, büyük yapıların yığında çoklu kopyalanmasından kaynaklanan performans kaybına neden oldu. Problemi, yapıları değişmez sınıflarla değiştirmekle çözdüler.
Hikaye
2. GIS geliştirme projesinde, referans alanlar içeren yapılar kopyalanırken karışıklık ortaya çıktı — yapının içindeki diziyi değiştirirken, geliştirici beklenmedik bir şekilde, dizinin kopyalandığı her yerde orijinalin değişeceğini beklemiyordu, “değer türü” olmasına rağmen.
Hikaye
3. Muhasebe yazılımında, iş varlıkları için yapılar ve sınıflar karıştırıldı: yapı için miras alma gerçekleştirme girişimi derleme hatası ile sonuçlandı, sistem mimarisini yeniden organize etmek zorunda kaldılar, bu da başlangıçta yapı ve sınıf seçimi gibi yanlış bir seçimden dolayı zaman alıcı oldu.