:: Меню ::

Головна
  • Про сайт
  • Введення
  • Середовище програмування VB .NET: Visual Studio .NET
  • Вирази, оператори і передача управління
  • Класи і об'єкти
  •  Спадкоємство і інтерфейси
  • Обробка подій і делегати
  • Обробка помилок в VB .NET
  • Форми Windows, графічний вивід і друк
  • Уведення-виведення
  •  Багатопотокові застосування
  • Підтримка баз-даних в VB .NET
  • Короткий огляд ASP .NET
  • Складки .NET, установка додатків і COM Interop
  • Книга для гостей
    Контакти
    Добавити у вибране

    :: Друзі ::

     
     

    :: Лічильники ::

    = =

     

     

     

     

    Приклад: клас 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, який отримує масив символів і перетворить їх в рядок.

    Оскільки строкові змінні в VB .NET стали об'єктними, при введенні «.» після імені строкової змінної з'являється підказка Intellisense із списком членів класу String.

    Приклад: клас Stringbuilder

    Надзвичайно корисний клас 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

    Конструктор

    Опис

    New()

    Викликається без параметрів. Створює порожній об'єкт Stringbuilder з початковою місткістю 16 символів

    New(Byval value As String)

    Створює об'єкт Stringbuilder, початковий стан якого визначається заданим рядком

    New (Byval capacity As Integer)

    Створює порожній екземпляр, але резервує місце для заданої кількості символів з можливістю подальшого необмеженого зростання в міру необхідності (якщо ви точно знаєте мінімальний початковий розмір рядка, цей варіант ефективніший за автоматичне збільшення об'єкту Stringbuilder)

    New(Byval capacity As Integer, Byval maxcapacity As Integer)

    Створює порожній екземпляр, резервує місце для заданої кількості символів, але допускає подальше зростання тільки до заданого порогу. При спробі перевищити задану максимальну кількість символів ініціюється виключення (див. розділ 7)

    New(Byval value As String, Byval capacity As Integer) Створює об'єкт Stringbuilder із заданим початковим станом і початковою місткістю

    New(Byval value As String, Byval startlndex As Integer, Byval length As Integer, Byval capacity As Integer)

    Створює об'єкт Stringbuilder із заданою початковою місткістю по частині рядка

     

    Скільки часу втрачається при створенні нових екземплярів рядка? Ми провели тестування (при цьому використовувалася програма, приведена в підрозділі «Хронометраж, — наскільки швидше працює клас Stringbuilder?» нижче). Виявилось, що клас Stringbuilder зазвичай працює в сотні разів швидше, ніж клас String. На практиці це співвідношення може бути і вище, оскільки в наших тестах не використовувалися додаткові можливості класу Stringbuilder, що дозволяють уникнути частого виділення пам'яті. В результаті оптимізації клас Stringbuilder може працювати ще швидше. З іншого боку, якщо ви просто звертаєтеся до окремих символів рядка і не збираєтеся змінювати її, звичайний клас String виявляється ефективнішим за клас Stringbuitder.

    У наступному фрагменті показано, як швидко створити рядок, що складається з 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 виконують декілька корисних операцій:

    • Replace(Byval oldchar As Char. Byval newchar As Char): замінює всі входження старого символу в рядку новим символом;
    • Replace (Byval oldvalue As String. Byval newvalue As String): замінює всі входження старого підрядка новим підрядком.

    У цього методу існують ще дві версії, що дозволяють замінити всі входження заданого підрядка або символу в заданому фрагменті об'єкту 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)

    У класі Stringbuilder визначений метод Equals, але на відміну від рядків два об'єкти Stringbuilder на однаковий вміст не обов'язково зважають рівними. Це пояснюється тим, що в .NET Framework дійсний вираз а.Equals(b) повинно залишатися істинним завжди, а для об'єктів Stringbuilder це неможливо, оскільки вони змінюються. Використовувати метод Equals для об'єктів Stringbuilder не рекомендується.

    Метод 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

     




    :: Наша кнопка ::

    Отримати код:

    Підтримайте наш сайт і розмістіть нашу кнопку на своєму ресурсі.


    :: Реклама ::

    Скачати безкоштовно програму Microsoft Front Page 2003


    :: Посилання ::

    -


     

     

     


    Copyright ©