|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Приклад: клас String
Іншим хорошим прикладом класу з декількома конструкторами є клас String. Хоча для конструювання рядків передбачений скорочений запис (послідовність символів, увязнена в лапки), в складніших випадках краще перейти на використання конструкторів. Наприклад, один з конструкторів створює рядок, що складається з декількох копій одного символу. Наступна команда створює рядок з 37 пропусків: Dim str As String
= New String((Cchar(" "), 37) В даному випадку
замість конструктора можна скористатися функцією Space (врахуйте, що в
режимі жорсткої перевірки типів Option Strict On рядок, що складається з одного
символу «пропуск», повинен перетворюватися в символ спеціальною
функцією). Узагальнена
форма цього конструктора виглядає так: New (Byval з
as Char, Byval count As Integer) При роботі
з класом Stri ng також часто використовується конструктор New(Byval val ue() As
Char, який отримує масив символів і перетворить їх в рядок.
Надзвичайно
корисний клас Stringbuilder входить в простір імен System.Text (простори
імен розглядаються в наступному розділі). Цей клас слід використовувати замість
звичайного класу String в тих випадках, коли ви збираєтеся внести постійні
зміни до рядка. Річ у тому, що при кожній зміні рядка (навіть при простому
додаванні нового символу) VB .NET доводиться створювати новий рядок, а ця
операція вимагає часу. При роботі з екземпляром класу Stringbuilder VB .NET
обходиться модифікацією початкового об'єкту. При створенні
порожнього об'єкту Stri ngbui I der методом New VB .NET резервує блок пам'яті
для 16 символів і автоматично нарощує його при включенні нових символів.
Об'єкт Stringbuilder можна розглядати як «інтелектуальний»
масив символів, який збільшується і зменшується у міру потреби і тому
в якомусь сенсі нагадує тип Stri ng в V-b6. Поточний розмір об'єкту Stri
ngbui I der називається місткістю (capacity). У класі Stri ngbui I der визначені
шість конструкторів, перерахованих в таблиці. 4.1. Таблиця
4.1.
Конструктори класу Stringbuilder
У наступному фрагменті
показано, як швидко створити рядок, що складається з 25 000 повторень
букви А: Dim bar As New
String("A" .25000) Dim foo As New
System.Text.SthngBuilder(Bar) Властивість Chars
дозволяє прочитати або записати символ, що знаходиться в заданій позиції
Stri ngbui I der. Індексація починається з 0, тому для екземпляра Stringbuilder
з ім'ям foo команда foo.Chars(l) = "b" замінює другий символ
рядка символом «b». За допомогою
властивості Length можна отримати або задати поточний розмір об'єкту Stri ngbuilder.
Якщо вказане значення менше поточного розміру, VB усікає об'єкт Stri ngbuilder.
Якщо при створенні об'єкту Stringbuilder була задана максимальна місткість,
у разі її перевищення ініціюється виключення (виключення розглядаються в
розділі 7). Часто використовувані
члени класу Strlngbuilder дуже сильно переобтяжені. Вони існують у
великій кількості версій, що дозволяє виконувати з рядками різноманітні
операції — включати і видаляти в них рядки, символи, масиви символів і так далі
Наприклад, метод Append додає символи в кінець об'єкту Stringbuilder: Dim foo As New System.Text.StringBuilder() foo = foo.Append("A") foo.Appenc("hello") ' Додає 5 символів foo.Append(37) ' Додає 2 символи foo. Append (new
Random()) '?? Як показує
останній рядок приведеного фрагмента, до об'єкту Stri ngbui I der можна приєднати
довільний об'єкт. При цьому VB автоматично обчислює строкове представлення
об'єкту (а точніше, викликає його метод Tostri ng) і приєднує отриманий рядок
до Stringbuilder. Звичайно, свідомість строкового представлення об'єкту залежить
від реалізації класу. У приведеному прикладі замість випадкового числа буде доданий
даремний рядок System.Random (але команда foo. Append (New Random(). Next
приведе до бажаного результату). Метод Insert вставляє об'єкт або значення в задану
позицію об'єкту Stringbuilder: Insert(Byval
index As Integer.ByVal thing As Object) Схожу сигнатуру має
і метод Remove, що видаляє задану кількість символів із заданої позиції: Remove(Byval
startlndex As Integer.ByVal length As Integer) Переобтяжені
версії методу Replace виконують декілька корисних операцій:
У цього методу існують
ще дві версії, що дозволяють замінити всі входження заданого підрядка
або символу в заданому фрагменті об'єкту Stri ngbuilder (параметр count визначає
довжину фрагмента): Repliсе(Byval
oldchar As Char.ByVal newchar As Char.ByVal startlndex As Integer._ Byval count
A's Integer) Replacefoldvalue
As String.ByVal newvalue As String.ByVal startlndex As Integer._ Byval count
As Integer) Метод
Tostri ng перетворить об'єкт Stri ngbui1der в String. Це робиться лише після
того, як всі необхідні зміни будуть внесені і надалі ви збираєтеся тільки
читати вміст4 рядки.
Хронометраж — наскільки швидше працює клас Stringbuilder?
Хоча
Microsoft не дозволяє публікувати точні результати хронометражу для бета-версий (і
це цілком розумно, оскільки в них міститься великий об'єм налагоджувальної
коди), відношення результатів, отриманих в ході вимірювань, майже завжди залишається
більш менш постійним. Іноді в остаточній версії це відношення злегка змінюється,
але в набагато меншому ступені, чим абсолютні значення показників. Хронометраж в
VB .NET реалізується легко — досить об'єднати метод Now з методом Ticks класу
Datetlme. Як підказує само назву, метод Now повертає поточні показання
системних годинників. Метод Ti cks повертає число типу Long, рівне кількості 100-наносекундних
інтервалів, що пройшли з 00:00 1 січня 0001 року (1 наносекунда
= 1/1 000 000 000 секунд). Наступна
програма використовувалася для оцінки того, наскільки швидше клас Stringbuilder
виконує приєднання символів в кінець рядка в порівнянні з класом String.
Виграш росте із збільшенням кількості символів; при 50 000 символів ефективність
зростала більш ніж в 800 разів! Option
Strict On Module Modulel Sub Main() Dim i As
Integer Dim Starttime
As New Datetime() Dim Endtime
As New Datetime() Starttime =DateTime.Now() Dim thetext
As New System.Text.SthngBuilder() For i =1
To 50000 thetext =theText.Append("A") Next Endtime =DateTime.Now Dim
answerl,answer2 As Long '
Кількість 100-наносекундних інтервалів answer1 =EndTi
me.Ticks()-StartTime.Ticks() Starttime =DateTime.Now() Dim
astring As String For i =1
To 50000 astring
=aString & "A" Next Endtime =DateTime.Now '
Кількість 100-наносекундних інтервалів answer2 =(Endtime.Ticks()-StartTime.Ticks()) Console.WriteLine("Stringbuilder
was " & _ answer? /answerl & "times faster.") Console.ReadLine() End Sub End Module
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||