| СТАТЬЯ | 31.10.02 | 
 Знакомство 
  с Microsoft .NET Framework
Знакомство 
  с Microsoft .NET Framework© Алексей Федоров
  Статья была опубликована в журнале 
  "КомпьютерПресс" 
В предыдущих частях данной статьи мы начали знакомство с Microsoft .NET Framework — ключевым компонентом Microsoft .NET, представляющим собой платформу для создания, внедрения и выполнения Web-сервисов и приложений. Мы рассказали об основных компонентах Microsoft .NET Framework и кратко описали их назначение. Мы довольно подробно рассмотрели Common Language Runtime (CLR) — среду выполнения .NET-приложений, завершив знакомство с Common Language Runtime описанием Common Type System. После этого мы перешли к библиотеке классов. В этом номере мы продолжим знакомство с библиотекой классов .NET Framework Class Library — рассмотрим массивы (класс System.Array) и коллекции (пространство имен System.Collections).
 ласс 
  System.Array содержит свойства и методы для работы с массивами. Элемент массива 
  может быть любого типа, так как в .NET все типы — это объекты, базирующиеся 
  на классе System.Object. массив хранит элементы типа System.Object. Для того 
  чтобы найти тип, которым был объявлен массив, мы используем метод GetType. Свойство 
  Length позволяет узнать общее число элементов массива или число элементов, которое 
  он может содержать. Свойство Rank возвращает число измерений массива. Чтобы 
  определить, обладает ли массив фиксированным размером, мы используем свойство 
  IsFixedSize. Массивы с фиксированным размером не позволяют добавлять и удалять 
  элементы — они поддерживают только модификацию существующих элементов. Массивы 
  могут быть только для чтения — чтобы это узнать, нужно использовать свойство 
  IsReadOnly.
ласс 
  System.Array содержит свойства и методы для работы с массивами. Элемент массива 
  может быть любого типа, так как в .NET все типы — это объекты, базирующиеся 
  на классе System.Object. массив хранит элементы типа System.Object. Для того 
  чтобы найти тип, которым был объявлен массив, мы используем метод GetType. Свойство 
  Length позволяет узнать общее число элементов массива или число элементов, которое 
  он может содержать. Свойство Rank возвращает число измерений массива. Чтобы 
  определить, обладает ли массив фиксированным размером, мы используем свойство 
  IsFixedSize. Массивы с фиксированным размером не позволяют добавлять и удалять 
  элементы — они поддерживают только модификацию существующих элементов. Массивы 
  могут быть только для чтения — чтобы это узнать, нужно использовать свойство 
  IsReadOnly. 
For I = Chars.GetLowerBound(0) to Chars.GetUpperBound(0) 
  ' 
  ' Выполняем операцию над элементами – Chars(I) 
  ' 
  Next 
'--------------------------------------- 
  ' .NET – пример использования массивов 
  '--------------------------------------- 
  Imports System 
  Imports System.Array 
  
  Module Module1 
  
     Sub Main() 
        Dim Langs() As String = _ 
           {"VB.NET", "C#", 
  "J#", "C++", "JScript .NET", "Perl .NET"} 
  
        ShowArray(Langs, "Original Array") 
  
        Array.Sort(Langs) 
        ShowArray(Langs, "Sorted Array") 
  
        Array.Reverse(Langs) 
        ShowArray(Langs, "Reversed Array") 
  
      End Sub 
  
      Sub ShowArray(ByVal A As Object, ByVal Title As String) 
  
         Dim I As Integer 
         Console.WriteLine(Title) 
         For I = A.GetLowerBound(0) To A.GetUpperBound(0) 
  
           Console.WriteLine(I & 
  ControlChars.Tab & A(I)) 
         Next 
         Console.WriteLine() 
       End Sub 
  
     End Module 
 
  
'------------------------------------------------------- 
  ' .NET – пример использования методов GetValue/SetValue 
  '------------------------------------------------------- 
  Imports System 
  Imports System.Array 
  
  Module Module1 
  
     Sub Main() 
  
        Dim I As Integer 
        Dim A() As Integer = {0, 1, 2, 3, 4, 5, 
  6, 7, 8, 9} 
        With A 
  
        Console.WriteLine("Original Array:") 
  
           For I = .GetLowerBound(0) To 
  .GetUpperBound(0) 
             Console.WriteLine("Array(" 
  & I & ")" & " = " & .GetValue(I)) 
                .SetValue(.GetValue(I) 
  * 10, I) 
        Next 
  
        Console.WriteLine("Modified Array:") 
  
        For I = .GetLowerBound(0) To .GetUpperBound(0) 
  
          Console.WriteLine("Array(" 
  & I & ")" & " = " & .GetValue(I)) 
        Next 
  
  End With 
  
  End Sub 
  
  End Module 
 
  
 оллекции в библиотеке 
  классов Microsoft .NET Framework реализованы в пространстве имен System.Collections. 
  Здесь мы можем найти самые различные коллекции объектов — списки, очереди, хэш-таблицы, 
  словари. В этом пространстве имен также определен ряд интерфейсов, задающих 
  базовую функциональность коллекций. На рисунке показаны основные коллекции, 
  реализованные в пространстве имен System.Collections.
оллекции в библиотеке 
  классов Microsoft .NET Framework реализованы в пространстве имен System.Collections. 
  Здесь мы можем найти самые различные коллекции объектов — списки, очереди, хэш-таблицы, 
  словари. В этом пространстве имен также определен ряд интерфейсов, задающих 
  базовую функциональность коллекций. На рисунке показаны основные коллекции, 
  реализованные в пространстве имен System.Collections. 
Наше знакомство с коллекциями мы начнем с краткого обзора интерфейсов, а затем перейдем к коллекциям. Как мы помним, интерфейсы используются для задания определенной функциональности без ее реализации — классы, которые реализуют интерфейсы, должны реализовать и методы, определенные в интерфейсах.
Интерфейс IEnumerable описывает энумератор (enumerator), используемый для простой итерации по содержимому коллекции. Этот интерфейс описывает единственный метод — GetEnumerator, который возвращает IEnumerator — энумератор, используемый для итерации. Свойство Current типа Object возвращает текущий элемент коллекции. Метод MoveNext() перемещает нас на следующий элемент коллекции, а метод Reset() устанавливает энумератор в начальную позицию — перед первым элементом коллекции.
Этот интерфейс наследует интерфейс IEnumerable и служит базовым интерфейсом для реализации коллекций — все классы в пространстве имен System.Collections реализуют этот интерфейс. Интерфейс ICollection определяет ряд методов, свойственных всем коллекциям, поддержку размера коллекции, энумераторов и синхронизации. Наиболее важным свойством является свойство Count типа Integer, которое возвращает число элементов в данной коллекции. Метод CopyTo(Array, Integer) служит для копирования элементов коллекции в одномерный массив, начиная с указанного индекса.
Данный интерфейс расширяет интерфейс ICollection и описывает доступ к элементам коллекций как к парам «ключ/значение» и позволяет выполнять перечисление пар «ключ/значение». Реализации этого интерфейса могут включать коллекции только для чтения (словарь не может быть модифицирован), коллекции фиксированного размера (не допускается добавление и удаление элементов), а также коллекции переменного размера (поддерживаются операции добавления, удаления и модификации элементов).
Свойства и методы интерфейса IDictonary:
Этот интерфейс наследует от интерфейсов ICollection и IEnumerable и определяет коллекцию значений, которая может быть отсортирована и члены которой могут быть доступны по индексу. Интерфейс IList является базовым интерфейсом для всех классов, реализующих списки. Методы Add(Object) и Remove(Object) используются для добавления и удаления элементов списка. Метод Contains(Object) служит для проверки того, содержит ли список указанное значение. Метод Clear() удаляет все элементы из списка.
После того как мы ознакомились с базовой функциональностью коллекций, давайте рассмотрим классы, реализованные в пространстве имен System.Collections.
Этот класс реализует динамический массив, основанный на интерфейсе IList. В отличие от класса Array, который мы рассмотрели выше, класс ArrayList может увеличиваться и уменьшаться в размерах; кроме того, можно динамически добавлять и удалять его элементы.
Если нам необходим массив фиксированного размера, элементы которого могут быть модифицированы, но не могут быть ни удалены, ни добавлены, мы должны использовать метод FixedSize(ArrayList или IList). Этот метод возвращает список фиксированного размера для данного массива. При создании массивов, доступных только для чтения, мы должны использовать метод ReadOnly(ArrayList или IList) — он возвращает список, доступный только для чтения. Свойство Capacity типа Integer возвращает число элементов, которое может содержать массив. Свойство Count типа Integer возвращает текущее число элементов в массиве, а свойство Item(Integer) типа Object обеспечивает доступ к элементу с указанным индексом.
В следующем примере показано, как использовать класс ArrayList:
'---------------------------------------------- 
  ' .NET – пример использования класса ArrayList 
  '---------------------------------------------- 
  Imports System 
  Imports System.Collections 
  
  Module Module1 
  
     Sub Main() 
  
        Dim AList As New ArrayList() 
        Dim E As IEnumerator 
          With AList 
             .Add("Microsoft 
  ") 
             .Add(".NET 
  ") 
             .Add("Platform") 
  
             Console.WriteLine(.Capacity) 
  
             Console.WriteLine(.Count) 
  
             E = .GetEnumerator 
  
             While E.MoveNext() 
  
                 Console.WriteLine(E.Current) 
  
             End While 
  
         End With 
  
       End Sub 
  
  End Module
Отметим, что в этом примере мы используем интерфейс IEnumerator для перебора элементов массива. Однако тот же самый эффект может быть достигнут с помощью операторов For/Next:
    For I = 0 To .Count - 1 
       Console.WriteLine(ControlChars.Tab & .Item(I)) 
  
  Next 
   
Данный класс представляет собой массив битов. Каждый бит может иметь значение типа Boolean и принимать значение true или false. Класс BitArray поддерживает такие логические операции, как Not, Or и Xor.
Методы класса BitArray:
Продемонстрируем использование ряда операций над массивами битов на примере:
'---------------------------------------------- 
  ' .NET – пример использования класса BitArray 
  '---------------------------------------------- 
  Imports System 
  Imports System.Collections 
  
  Module Module1 
  
     Sub Main() 
  
        Dim Bools() As Boolean = {True, False, True, 
  False, _ 
        True, False, True, False} 
        Dim BA As New BitArray(Bools) 
        Dim BA2 As New BitArray(8, False) 
  
        ShowArray("Original Array:", BA) 
  
        ShowArray("After NOT:", BA.Not) 
  
        BA = New BitArray(Bools) 
        ShowArray("After AND:", BA.And(BA2)) 
  
        BA = New BitArray(Bools) 
        ShowArray("After OR:", BA.Or(BA2)) 
  
        BA = New BitArray(Bools) 
        ShowArray("After XOR:", BA.Xor(BA2)) 
  
  
     End Sub 
  
     Sub ShowArray(ByVal Header As String, ByVal A As IEnumerable) 
  
  
        Dim E As IEnumerator 
        E =A.GetEnumerator 
        Console.WriteLine(ControlChars.NewLine & 
  Header) 
        Console.WriteLine("+-----+-----+-----+-----+" 
  & _ 
                                      "-----+-----+-----+-----+") 
  
        While E.MoveNext() 
           Console.Write("|") 
  
           Console.Write(CType(E.Current, 
  String).PadLeft(5)) 
        End While 
        Console.WriteLine("|") 
        Console.WriteLine("+-----+-----+-----+-----+" 
  & _ 
                                      "-----+-----+-----+-----+") 
  
  
     End Sub 
  End Module 
Класс представляет собой хэш-таблицу, реализующую интерфейс IDictionary. Этот класс является коллекцией пар «ключ/значение», которые собраны в хэш-таблицу, где хэш-значение используется в качестве ключа. Класс HashTable может использоваться в тех случаях, когда необходима коллекция пар «ключ/значение».
Ниже показано использование HashTable:
'----------------------------------------------- 
  ' .NET – пример использования класса HashTable 
  '----------------------------------------------- 
  Imports System 
  Imports System.Collections 
  
  Module Module1 
  
       Sub Main() 
  
       Dim HT As New Hashtable() 
       With HT 
  ' 
  '    Построим хэш-таблицу с телефонными кодами стран 
  ' 
          .Add("Austria", "+43") 
  
          .Add("France", "+33") 
  
          .Add("Germany", "+49") 
  
          .Add("Italy", "+39") 
  
          .Add("Spain", "+34") 
  
          .Add("Switzerland", 
  "+41") 
          ShowTable("Original Table", 
  HT) 
  ' 
  '     Удалим Швейцарию, если она есть в таблице 
  ' 
          If .Contains("Switzerland") 
  Then 
            .Remove("Switzerland") 
  
          End If 
          ShowTable("Modified Table", 
  HT) 
        End With 
  
      End Sub 
  
      Sub ShowTable(ByVal Header As String, ByVal T As Hashtable) 
  
  
         Dim E As IDictionaryEnumerator 
         E = T.GetEnumerator 
         Console.WriteLine(ControlChars.NewLine 
  & Header) 
         While E.MoveNext() 
             Console.WriteLine(E.Key 
  & "=" & E.Value) 
         End While 
  
      End Sub 
  End Module 
Как и рассмотренный выше класс HashTable, этот класс реализует интерфейс IDictionary. Но класс SortedList поддерживает коллекцию пар «ключ/значение», используя ключ, а не хэш-значения, в отличие от класса HashTable. Элементы коллекции могут быть доступны как по ключу, так и по индексу.
Покажем использование класса SortedList на примере:
'------------------------------------------------ 
  ' .NET – пример использования класса SortedList 
  '------------------------------------------------ 
  Imports System 
  Imports System.Collections 
  
  Module Module1 
  
     Sub Main() 
  
        Dim SL As New SortedList() 
        With SL 
  ' 
  '     Построим отсортированный список кодов стран 
  ' 
          .Add("Austria", "+43") 
  
          .Add("France", "+33") 
  
          .Add("Germany", "+49") 
  
          .Add("Italy", "+39") 
  
          .Add("Spain", "+34") 
  
          .Add("Switzerland", 
  "+41") 
          ShowTable("Original Table", 
  SL) 
  ' 
  '     Удалим Швейцарию, если она есть в таблице 
  ' 
          If .Contains("Switzerland") 
  Then 
            .Remove("Switzerland") 
  
          End If 
          ShowTable2("Modified Table", 
  SL) 
         End With 
  
       End Sub 
  
       Sub ShowTable(ByVal Header As String, ByVal L 
  As SortedList) 
  
          Dim E As IDictionaryEnumerator 
  
          E = L.GetEnumerator 
          Console.WriteLine(ControlChars.NewLine 
  & Header) 
          While E.MoveNext() 
             Console.WriteLine(E.Key 
  & "=" & E.Value) 
          End While 
  
        End Sub 
  
        Sub ShowTable2(ByVal Header As String, ByVal 
  L As SortedList) 
  
          Dim I As Integer 
          Console.WriteLine(ControlChars.NewLine 
  & Header) 
          For I = 0 To L.Count - 1 
             Console.WriteLine(L.GetKey(I) 
  & "=" & L.GetByIndex(I)) 
          Next 
  
     End Sub 
  
     End Module 
Следует отметить, что, в отличие от предыдущего примеров, в данном случае мы 
  получаем список элементов, отсортированных по значению ключа, а не по хэш-значению, 
  как в случае с классом HashTable. Также нужно обратить внимание на метод ShowTable2, 
  где показано, как обратиться к элементам класса SortedList по индексу и как 
  найти все ключи (метод GetKey(Integer)) и значения (метод GetByIndex(Integer)). 
 
Этот класс реализует простую очередь объектов типа «последним вошел — первым вышел» (last-in-first-out, LIFO). Класс Stack реализует стек с помощью таких методов, как Push и Pop, для помещения элементов на стек и удаления их с вершины стека. Метод Peek возвращает верхний элемент на стеке без снятия этого элемента со стека. Для копирования элементов стека в новый массив мы можем использовать метод ToArray.
Класс Stack также реализует метод GetEnumerator, который можно использовать для получения энумератора для данного стека. Стек реализован как циркулярный буфер.
Использование класса Stack показано в следующем примере:
'------------------------------------------- 
  ' .NET – пример использования класса Stack 
  '------------------------------------------- 
  Imports System 
  Imports System.Collections 
  
  Module Module1 
  
  
     Sub Main() 
        Dim S As New Stack() 
  
        With S 
  ' 
  '     Поместим на стек 3 элемента 
  ' 
          .Push("Item0") 
          .Push("Item1") 
          .Push("Item2") 
          ShowStack("Original Stack", 
  S) 
  ' 
  '     Снимем верхний элемент 
  ' 
          .Pop() 
          ShowStack("Modified Stack", 
  S) 
  ' 
  '     Поместим один элемент 
  ' 
          .Push("Item3") 
  ' 
  '     Покажем верхний элемент, не удаляя его 
  ' 
          ShowStack("Modified Stack", 
  S) 
          Console.WriteLine("Top 
  item: " & .Peek()) 
          End With 
  
      End Sub 
  
      Sub ShowStack(ByVal Header As String, ByVal S As IEnumerable) 
  
  
          Dim E As IEnumerator 
          E = S.GetEnumerator 
          Console.WriteLine(ControlChars.NewLine 
  & Header) 
          While E.MoveNext() 
             Console.WriteLine(E.Current) 
  
          End While 
  
     End Sub 
  
     End Module 
Данный класс реализует коллекцию объектов типа «первым вошел — первым вышел» (first-in-first-out, FIFO). Для добавления и удаления объектов из очереди используются методы Dequeue() и Enqueue(Object). Первый из них удаляет элемент в начале очереди, а второй — добавляет элемент в конец очереди. Для копирования элементов очереди в новый массив можно использовать метод ToArray().
Пример использования класса Queue показан ниже:
'------------------------------------------- 
  ' .NET – пример использования класса Queue 
  '------------------------------------------- 
  Imports System 
  Imports System.Collections 
  
  Module Module1 
  
  
     Sub Main() 
        Dim Q As New Queue() 
  
        With Q 
  ' 
  '     Добавим 3 элемента 
  ' 
          .Enqueue("Item0") 
  
          .Enqueue("Item1") 
  
          .Enqueue("Item2") 
  
          ShowQueue("Original Queue", 
  Q) 
  ' 
  '     Удалим первый элемент 
  ' 
          .Dequeue() 
          ShowQueue("Modified Queue", 
  Q) 
  ' 
  '    Добавим один элемент 
  ' 
          .Enqueue("Item3") 
  
          ShowQueue("Modified Queue", 
  Q) 
  ' 
  '    Покажем первый элемент, не удаляя его 
  ' 
          Console.WriteLine("Top 
  item: " & .Peek()) 
      End With 
  
    End Sub 
  
    Sub ShowQueue(ByVal Header As String, ByVal Q As IEnumerable) 
  
          Dim E As IEnumerator 
          E = Q.GetEnumerator 
          Console.WriteLine(ControlChars.NewLine 
  & Header) 
          While E.MoveNext() 
              Console.WriteLine(E.Current) 
  
          End While 
  
      End Sub 
  
  End Module 
Нужно отметить, что метод Peek() играет такую же роль, что и в классе Stack, — он возвращает верхний элемент, не удаляя его из очереди.
 так, 
  мы ознакомились с массивами (класс System.Array) и коллекциями (пространство 
  имен System.Collections). В следующем номере мы продолжим изучение библиотеки 
  классов .NET Framework Class Library и рассмотрим строки и класс System.String.
так, 
  мы ознакомились с массивами (класс System.Array) и коллекциями (пространство 
  имен System.Collections). В следующем номере мы продолжим изучение библиотеки 
  классов .NET Framework Class Library и рассмотрим строки и класс System.String. 
За дополнительной информацией обращайтесь в компанию Interface Ltd.
Дополнительная информация
За дополнительной информацией обращайтесь в компанию Interface Ltd.
| INTERFACE Ltd. | 
 | ||||