Dizgelerle çalışma, Visual Basic'deki en sık karşılaşılan görevlerden biridir. Dilin tarihinde String türü başlangıçta değiştirilebilir (mutable) bir nesne olarak tasarlanmış, ancak daha sonra çoklu veri işleme sırasında güvenilirliği ve güvenliği artırmak için değiştirilemez (immutable) olarak uygulanmıştır. Temel problem, her bir birleştirme işlemi sırasında, + veya & ile dizgelerin eklenmesiyle yeni bir nesne oluşturulmasıdır — bu, büyük miktarda metin ile çalışırken, örneğin raporlar veya günlükler oluştururken performansı önemli ölçüde etkiler.
Çözüm, bellek tahsislerini ve veri kopyalamalarını en aza indirerek dizgeleri etkin bir şekilde 'inşa' etmeye olanak tanıyan özel StringBuilder sınıfının kullanılması olmuştur. Bu sınıf, gerektiğinde dinamik olarak genişleyen bir tampon saklar ve sonuç bir ToString() çağrısıyla elde edilebilir.
Kod örneği:
Dim sb As New System.Text.StringBuilder() For i As Integer = 1 To 10000 sb.Append("Line " & i & vbCrLf) Next dim result As String = sb.ToString()
Anahtar özellikler:
String — değerler değiştirilemez, her atama işlemi bellekte yeni bir dizgi oluşturur.StringBuilder — sık değişiklikler için etkilidir, büyük veri setlerini birleştirmek için uygundur.+ veya & operatörüyle dizgeleri birleştirmek, yalnızca küçük ve nadir işlemler için uygundur.Neden bazen "+" ve "&" dizgeleri birleştirirken farklı davranır?
+ operatörü, bir operatör sayısı veya başka bir tür olduğunda beklenmedik tür dönüşümüne yol açabilir. & operatörü ise dizgeleri katı bir şekilde birleştirir, operatör dizgi olmasa bile (dönüşür).
Dim a As String = "5" Dim b As Integer = 10 Dim s1 = a + b ' Bu, sayıların toplamı nedeniyle 15 olacaktır! Dim s2 = a & b ' Bu, dizgilerin birleştirilmesi nedeniyle "510" olacaktır
StringBuilder, String'den daha yavaş olabilir mi?
Evet, küçük dizgeler (örneğin, 2-3 işlem) ve nadir değişiklikler için StringBuilder aşırı olabilir — o zaman sıradan birleştirme, bellek üzerindeki daha az yük nedeniyle hız açısından karşılaştırılabilir veya hatta daha hızlı olabilir.
Visual Basic'de dizgeleri indeksle değiştirmek mümkün mü?
Hayır, dizgeler değiştirilemez — bir karakteri doğrudan bir indeksle değiştirmek mümkün değildir. Yeni bir nesne oluşturmak gereklidir:
Dim str As String = "test" str = str.Substring(0, 1) & "A" & str.Substring(2) ' Artık str = "tAst"
+ operatörünün kullanılması+ ile türlerin dolaylı döngülerini kullanmak, özellikle değişkenler dizgi olmadığındaProje, dizgileri s = s & Line operatörü ile satır satır dışa aktardı ve 10.000 üzeri yineleme gerçekleştirdi. Büyük hacimlerde performans keskin bir şekilde düşüyordu.
Artıları:
Eksileri:
Birleştirmeyi StringBuilder ile değiştirdik, tüm metni topladık ve yalnızca döngüden sonra bir kez dizgiye dönüştürdük.
Artıları:
Eksileri: