Знайомство з Microsoft. NET Framework. Частина 2

Частина 1

Зміст



У попередній статті ми почали знайомство з Microsoft. NET Framework – ключовим компонентом Microsoft. NET, що представляє собою платформу для створення, впровадження та виконання Web-сервісів і додатків. Ми розглянули основні компоненти Microsoft. NET Framework і коротко описали їх призначення. Ми також почали більш докладний розгляд Common Language Runtime (CLR) – середовища виконання. NET-додатків. У цій частині статті ми продовжимо розмову про Common Language Runtime і зупинимося на Common Type System.


Common Type System


Common Type System (CTS) – це останній компонент Common Language Runtime, який ми розглянемо в даній статті. CTS визначає типи, які підтримуються Common Language Runtime. Типи можна умовно розділити на дві великі групи: дані зі значеннями (value types) і посилальні типи (reference types). У кожній групі існують підтипи (див. рис. 1).


Дані зі значеннями описують значення, подаються послідовністю байтів. Для таких типів існує поняття ідентичності. Наприклад, 32-бітове цілочисельне значення займає певну послідовність байтів. Два 32-бітових цілочисельних значення ідентичні, якщо вони містять одне і те ж число. До даних зі значеннями також відносяться вбудовані типи, що розглядаються нижче. Посилальні типи служать для опису значень, що представляються місцезнаходженням послідовності байтів. Посилальні типи поділяються на три категорії:



Складовою частиною Common Type System є вбудовані типи (табл. 1), безпосередньо підтримувані віртуальної виконуючою системою (Virtual Execution System, VES).

Таблиця 1













































































Тип


Ім'я в бібліотеці класів


Опис

bool System.Boolean Зберігає значення true / false
char System.Char Зберігає 16-бітний Unicode-символ
object System.Object Зберігає об'єктне значення
string System.String Зберігає Unicode-рядок
float32 System.Single Зберігає 32-бітове значення з плаваючою точкою
float64 System.Double Зберігає 64-бітове значення з плаваючою точкою
int8 System.SByte Зберігає знакова 8-бітове цілочисельне значення
int16 System.Int16 Зберігає знакова 16-бітове цілочисельне значення
int32 System.Int32 Зберігає знакова 32-бітове цілочисельне значення
int64 System.Int64 Зберігає знакова 64-бітове цілочисельне значення
natural int System.IntPtr Зберігає знакова цілочисельне значення природного розміру
natural unsigned int System.UIntPtr Зберігає беззнаковое цілочисельне значення природного розміру
typedref System.TypedReference Покажчик на тип
unsigned int8 System.Byte Зберігає беззнаковое 8-бітове цілочисельне значення
unsigned int16 System.UInt16 Зберігає беззнаковое 16-бітове цілочисельне значення
unsigned int32 System.UInt32 Зберігає беззнаковое 32-бітове цілочисельне значення
unsigned int64 System.UInt64 Зберігає беззнаковое 64-бітове цілочисельне значення

Ми розглянемо типи та його підтипи більш детально, але перш відзначимо, що в основі всіх типів, як, втім, і в основі всієї ієрархії класів Microsoft. NET Framework, лежить клас System.Object. Для всіх типів, які будуть розглянуті нижче, цей клас, зокрема, надає методи, перераховані в табл. 2.

Таблиця 2






















Метод


Опис


Equals


Підтримує порівняння об'єктів одного класу


Finalize


Виконує роботи з очистки пам'яті перед знищенням об'єкта


GetHashCode


Генерує число, яке відповідає значенню, що зберігається в об'єкті


ToString


Повертає рядок, що містить опис екземпляра класу


GetType


Повертає тип об'єкта


Далі ми зможемо переконатися, що всі типи так чи інакше успадковують від System.Object. Почнемо з даних зі значеннями.


Дані зі значеннями


Як ми зазначили вище, до даних зі значенням ставляться як вбудовані типи так і обумовлені користувачами. Всі вбудовані типи базуються на класі System.ValueType, який є безпосереднім спадкоємцем System.Object. Кожен клас, який реалізує вбудований тип, підтримує певний набір інтерфейсів, які використовуються для реалізації тих чи інших операцій, а також унікальні для даного типу властивості і методи. Наприклад, клас Boolean підтримує інтерфейси IConvertible (для виконання операцій перетворення) і IComparable (для виконання операцій порівняння), а також містить такі властивості, як FalseString і TrueString. Крім того, клас Byte підтримує інтерфейси IConvertible і IComparable, а також інтерфейс IFormattable, використовуваний для перетворення значень у їх рядкове представлення. Рухаючись далі за списком спадкоємців класу System. ValueType, ми знаходимо клас Char, який підтримує такі методи, як IsDigit, IsLetter, IsLetterOrDigit, IsNumber тощо, істотно полегшують роботу з символами.


Класи, що представляють цілочисельні типи – Int16, Int32, Int64, IntPtr, UInt16, UInt32, UInt64 і UIntPtr, містять константи MinValue і MaxValue, що задають мінімальне та максимальне число, яке може міститися в даному типі, а також метод Parse, використовуваний для перетворення рядка, що складається з набору цифр, у відповідний тип даних.


Типи з плаваючою точкою – Single і Double – містять властивості Epsilon (мінімальне позитивне число даного типу), MinValue (мінімально допустиме число), MaxValue (максимально допустиму кількість), Nan (Константа Not-A-Number, не число), NegativeInfinity (константа, що описує негативну нескінченність) і PositiveInfinity (константа, що описує позитивну нескінченність), а також методи IsInfinity, IsNan, IsNegativeInfinity і IsPositiveInfinity, використовувані для перевірки збережених у змінній даного типу значень.


Перерахування


Серед розмаїття типів, які можуть визначати користувачі, відзначимо перерахування, що створюються на базі класу System. Enum. Цей клас підтримує інтерфейси IComparable, IFormattable і IConvertible, а також методи для отримання імен констант (GetName, GetNames), одержання значень (GetValues), визначення типу елементів перерахування (GetUnderlyingType) і ряд інших.
У наступному прикладі показано, як створити просте перерахування і скористатися методами GetNames і GetValues для отримання списку імен всіх його полів і їх значень:


Module Module1

     ”
"Геометричні фігури
     “
      Public Enum Shapes
          None = 0
          Circle = 1
          Rectangle = 2
          Ellipse = 3
          Triangle = 4
     End Enum

     Sub Main()

          Dim GeoShapes As New Shapes()
          Dim Names As String()
          Dim Values() As Integer
          Dim I As Integer
          Names = GeoShapes.GetNames(GeoShapes.GetType)
          Values = GeoShapes.GetValues(GeoShapes.GetType)
          Console.WriteLine()
          For I = 0 To Names.GetUpperBound(0)
Console.WriteLine (vbTab & Names (I) & "=" & _
                    CType(Values(I), Integer).ToString(“G”))
          Next
          Console.WriteLine()

     End Sub
End Module


Структури


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


Розглянемо невеликий приклад. Створимо структуру TPoint, у якої буде два поля: цілочисельні члени X і Y. У коді нашої програми, написаної на Visual Basic.NET, створимо змінну типу TPoint, инициализируем її поля і виведемо на екран їх значення. Як це зробити, показано нижче:


Module Module1


"Структура TPoint містить два цілочисельних члена

     Structure TPoint
          Public X As Integer
          Public Y As Integer
     End Structure

     Sub Main()

"Мінлива MyPoint – користувацького типу
     ”
          Dim MyPoint As TPoint


"Ініціалізація змінної

          With MyPoint
               .X = 100
               .Y = 150

"Висновок значень

Console.WriteLine ("X should be 100" & "X =" &. X)
Console.WriteLine ("Y should be 150" & "Y =" &. Y)
          End With
     End Sub
End Module


Тепер скопіюємо структуру в об'єктну змінну і змінимо значення її полів. Оскільки структура скопійована, а не передана за посиланням, оригінальні значення не змінюються:


Dim MyPoint As TPoint
Dim NewPoint

With MyPoint
     .X = 100
     .Y = 150
End With

NewPoint = MyPoint
With NewPoint
     .X = 200
     .Y = 50
End With
Console.WriteLine ("NewPoint X, Y =" & NewPoint.X & "," & NewPoint.Y)
Console.WriteLine ("MyPoint X, Y =" & MyPoint.X & "," & MyPoint.Y)

End Sub


У порівнянні зі структурами класи надають велику гнучкість. Ми розглянемо класи в наступному розділі.
Завершуючи наше знайомство з даними зі значеннями, нагадаємо, що вони описують значення, подаються послідовністю байтів. Багато вбудовані типи, перераховані в табл. 1, відносяться до цієї групи. Дані зі значеннями часто розташовуються на стеку – вони можуть бути локальними змінними, параметрами і значеннями, що повертаються функціями. Таким чином, дані зі значеннями не повинні займати багато місця – в загальному випадку вони займають не більше 12-16 байтів.


Посилальні типи


Друга група типів у Common Type System – це посилальні типи. Серед них є об'єктні, інтерфейсні та вказівні типи. Розгляд посилальних типів почнемо з класів.
У загальному випадку класи та об'єкти можуть містити поля, властивості, методи і події. Строго кажучи, властивості та події є методами. Властивості – це не більше ніж синтаксичні конструкції, які замінять звернення до відповідних методів Set і Get. Події служать для асинхронних оголошень про зміни в об'єктах. Клієнти надають спеціальні методи – обробники подій, які викликаються при виникненні даної події.


Класи


Класи – це структури, що визначають операції, які можуть виконувати об'єкти, а також значення, які об'єкти можуть зберігати. Функціональність об'єктів (примірників класу) доступна через поля і методи, а також через події.


Продовжимо наш приклад. Тепер ми перетворимо створену вище структуру в клас, який також буде мати два цілочисельних властивості. Для установки і отримання значень цих властивостей ми повинні використовувати ключове слово Property та нові в VB.NET конструкції мови – Get / End Get і Set / End Set. Ми також створюємо конструктор для нашого класу. Реалізація класу TPoint показана нижче:


Imports System

Module Module1


"Клас TPoint містить два цілочисельних властивості

     Public Class TPoint
          Dim ptX As Integer ” X
          Dim ptY As Integer ” Y

"Get і Set для властивості ptX

          Public Property X() As Integer
               Get
                    Return ptX
               End Get
               Set(ByVal Value As Integer)
                    ptX = Value
               End Set
          End Property

"Get і Set для властивості ptY

           Public Property Y() As Integer
               Get
                    Return ptY
               End Get
               Set(ByVal Value As Integer)
                    ptY = Value
               End Set
          End Property

"Конструктор

          Public Sub New()
               ptX = 0
               ptY = 0
          End Sub
     End Class

     Sub Main()
          Dim MyPoint As New TPoint()

"Ініціалізація об'єкту

          With MyPoint
               .X = 100
               .Y = 150

"Висновок значень

Console.WriteLine ("X should be 100" & "X =" &. X)
Console.WriteLine ("Y should be 150" & "Y =" &. Y)
          End With

     End Sub

End Module


Тут слід звернути увагу на те, що внутрішні імена властивостей класу (у нашому прикладі ptX і ptY) відрізняються від імен, "видимих" поза класом (у нашому прикладі X і Y).


Методи


Методи служать для реалізації функціональності класів. Розглянемо це на прикладі. Розширимо наш клас і реалізуємо метод SetXY, який буде встановлювати нові значення властивостей X і Y. Для цього додамо в опис класу наступний код:


Public Sub SetXY(ByVal newX As Integer, ByVal newY As Integer)
          X = newX
          Y = newY
End Sub


і змінимо код нашої програми:


     Sub Main()
          Dim MyPoint As New TPoint()

"Ініціалізація об'єкту

     With MyPoint
          .SetXY(100, 150)

"Висновок значень

Console.WriteLine ("X should be 100" & "X =" &. X)
Console.WriteLine ("Y should be 150" & "Y =" &. Y)
     End With

End Sub


Події


І, нарешті, останнім елементом, який може міститися у класах, створюваних користувачами, є подія. Як було зазначено вище, події служать для асинхронних оголошень про зміни в об'єктах. У нашому прикладі такою зміною в об'єкті буде завдання нових значень властивостей X і Y.


Реалізацію події почнемо з завдання його імені, супроводжуваного ключовим словом Event. Далі в код, який є причиною виникнення події (у нашому прикладі це код, що встановлює нові значення властивостей), додаємо ключове слово RaiseEvent і вказуємо назву виникає події:


Public Class TPoint
               Dim ptX As Integer ” X
               Dim ptY As Integer ” Y

               Event PTChanged()

               ”
"Get і Set для властивості ptX
               ”
               Public Property X() As Integer
                    Get
                         Return ptX
                    End Get
               Set(ByVal Value As Integer)
                    ptX = Value
                    RaiseEvent PTChanged()
               End Set
End Property

"Get і Set для властивості ptY

Public Property Y() As Integer
               Get
                    Return ptY
               End Get
               Set(ByVal Value As Integer)
                         ptY = Value
                         RaiseEvent PTChanged()
               End Set
End Property

"Конструктор

Public Sub New()
               ptX = 0
               ptY = 0
End Sub
Public Sub SetXY(ByVal newX As Integer, ByVal newY As Integer)
               X = newX
               Y = newY
     End Sub
End Class


Перевірити роботу нашого класу, який тепер має властивості, методи і події, можна за допомогою невеликого клієнтського додатку. Воно містить кнопку, список і панель. При кожному натисканні кнопки миші на панелі ми викликаємо метод SetXY нашого класу Tpoint, в результаті чого відбувається подія, яка реєструється нашим обробником події в списку.


Ось код клієнтського додатку (для простоти клас TPoint реалізований в окремій бібліотеці класів):


Imports ClassLibrary1
Public Class Form1
                    Inherits System.Windows.Forms.Form

                    Dim WithEvents MyPoint As TPoint

Private Sub Button1_Click (ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles Button1.Click
                         MyPoint = New TPoint()
                    End Sub

Private Sub Panel1_MouseDown(ByVal sender As Object, _
     ByVal e As System.Windows.Forms.MouseEventArgs) _
     Handles Panel1.MouseDown
                    MyPoint.SetXY(e.X, e.Y)
End Sub

Private Sub MyPoint_PTChanged() Handles MyPoint.PTChanged
          ListBox1.Items.Add(MyPoint.X & “, ” & MyPoint.Y)
     End Sub


End Class


Тепер об'єкт MyPoint типу TPoint описано з використанням ключового слова WithEvents. Це означає, що клас підтримує події і ми можемо створювати їх обробники. На рис. 2 показаний приклад роботи нашої програми.


Зверніть увагу на те, що в списку реєструються парні координати – X, Y, X, Y1, X1, Y1 і т.п. Це відбувається через те, що подія PTChanged виникає і при зміні значення властивості X, і при зміні значення властивості Y. Таким чином, якщо одночасно змінюються дві властивості, виникають дві події. Щоб виправити логіку, достатньо видалити код, що генерує події, з описів властивостей і додати його в реалізацію методу SetXY, як це показано нижче:


Public Sub SetXY(ByVal newX As Integer, ByVal newY As Integer)
               X = newX
               Y = newY
               RaiseEvent PTChanged()
End Sub


Делегати


Говорячи про події, слід згадати про делегатах – класі на базі System.Delegate, який містить посилання на метод. Таким чином, делегат – це покажчик на функцію або побічно-функція, що викликається. Частіше всього делегати використовуються для опису обробників подій або для створення побічно-викликаються функцій.


Нижче показано, як змінити код попереднього прикладу так, щоб обробник події став делегатом і підключався в момент виконання програми:


Dim MyPoint As TPoint

Private Sub Button1_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles Button1.Click
               MyPoint = New TPoint()
AddHandler MyPoint.PTChanged, AddressOf MyPoint_PTChanged
End Sub

Private Sub Panel1_MouseDown(ByVal sender As Object, _
          ByVal e As System.Windows.Forms.MouseEventArgs) _
          Handles Panel1.MouseDown
               MyPoint.SetXY(e.X, e.Y)
End Sub

Private Sub MyPoint_PTChanged()
          ListBox1.Items.Add(MyPoint.X & “, ” & MyPoint.Y)
End Sub


Такий підхід дозволяє нам створювати обробники подій для більш ніж однієї події, динамічно перемикати і відключати обробники подій і т.п.


Масиви


Масиви задаються описом типу елементів, числа розмірностей, і нижньої і верхньої меж кожної розмірності і можуть містити лише дані зазначеного типу. Кожен елемент масиву – це об'єкт. масив базується на класі System.Array, що описує базову функціональність масивів. Цей клас підтримує такі інтерфейси, як ICloneable (реалізує можливість створення ще одного екземпляра класу зі значеннями існуючого примірника), IList (реалізує можливість індивідуальної індексації колекції об'єктів), ICollection (реалізує можливість завдання розмірів, створення перечіслітелей і методів синхронізації) і IEnumerable (підтримує ітерацію за елементами колекції). Нижче наведено базові властивості (табл. 3) і методи (табл. 4), підтримувані масивами.

Таблиця 3


























Властивість


Опис

IsFixedSize

Дозволяє дізнатися, чи є масив масивом фіксованого розміру

IsReadOnly

Дозволяє дізнатися, чи є масив масивом тільки для читання

IsSynchronized

Дозволяє дізнатися, чи є доступ до масиву синхронізованим

Length

Повертає загальну кількість елементів у всіх розмірностях масиву

Rank

Повертає число розмірностей масиву

SyncRoot

Повертає об'єкт, який використовується для синхронізації доступу до масиву

Таблиця 4





















































Метод


Опис

BinarySearch Виконує пошук в одновимірному масиві, використовуючи алгоритм бінарного пошуку
Clear Обнуляє зазначені елементи масиву
Copy Копіює зазначені елементи масиву в інший масив і при необхідності виконує перетворення типів
IndexOf Повертає перший індекс зазначеного елемента в одновимірному масиві
LastIndexOf Повертає останній індекс зазначеного елемента в одновимірному масиві
Reverse Змінює порядок проходження елементів одновимірного масиву на протилежний
Sort Сортує елементи одновимірного масиву
CopyTo Копіює всі елементи одновимірного масиву в зазначений одновимірний масив, починаючи з вказаного індексу в приймаючій масиві
Clone Створює точну копію масиву
GetEnumerator Повертає інтерфейс IEnumerator для даного масиву
GetLength Повертає число елементів у зазначеній розмірності масиву
GetLowerBound Повертає нижній індекс масиву
GetUpperBound Повертає верхній індекс масиву
GetValue Повертає значення вказаних елементів масиву
SetValue Встановлює значення вказаних елементів масиву


У наступному прикладі показані деякі базові операції з масивами:


Sub Main()
     Dim IntArray() As Integer = {0, 1, 2, 3, 4, 5}

     With IntArray
               Console.WriteLine(vbTab & “Type = ” & _
                              .GetType.ToString)
Console.WriteLine (vbTab & "IsFixedSize =" &. IsFixedSize)
               Console.WriteLine(vbTab & “Length = ” & .Length)
               Console.WriteLine(vbTab & “Rank = ” & .Rank)
               Console.WriteLine(vbTab & “LowerBound = ” & _
                              .GetLowerBound(0))
               Console.WriteLine(vbTab & “UpperBound = ” & _
                              .GetUpperBound(0))
     End With

End Sub


Нижче показано, як використовувати методи GetValue і SetValue для отримання значень елементів масиву і зміни цих значень:


Console.WriteLine(vbCrLf & “Original Array:”)
     For I = .GetLowerBound(0) To .GetUpperBound(0)
Console.WriteLine (vbTab & "Array (" & I & ")" & "=" &. GetValue (I))
               .SetValue(.GetValue(I) * 10, I)
Next

Console.WriteLine(vbCrLf & “Modified Array:”)
     For I = .GetLowerBound(0) To .GetUpperBound(0)
Console.WriteLine (vbTab & "Array (" & I & ")" & "=" &. GetValue (I))
Next


Інтерфейси


Інтерфейси служать для опису функціональності, яка повинна бути реалізована тим чи іншим класом, але вони не містять коду, що реалізує дану функціональність. Оскільки інтерфейс не містить коду, його не можна успадкувати – замість цього ви наслідуєте клас, який реалізує той чи інший інтерфейс.


Інтерфейси широко використовуються в бібліотеці класів Microsoft. NET. Ми вже наводили кілька прикладів класів, в яких реалізуються такі інтерфейси, як IConvertible (для виконання операцій перетворення) і IComparable (для виконання операцій порівняння)). Повний список інтерфейсів, визначених у бібліотеці класів Microsoft. NET, представлений в документації до Microsoft. NET Framework SDK.


Покажчики


Common Language Runtie підтримує три типи вказівників. До першого типу відносяться керовані покажчики (managed poiters), що генеруються для аргументів методів, які передаються по посиланню. Це єдиний тип покажчиків, сумісний зі специфікацією Common Language Runtime. До двох інших типів відносяться некеровані покажчики (unmanaged pointers) і некеровані покажчики на функції (unmanaged function pointers). Так як некеровані покажчики не сумісні з Common Language Runtime, їх реалізація та підтримка залежать від вибраної мови програмування.


Common Language Runtime підтримує дві операції над керованими покажчиками: отримання значення, що зберігається за вказівником, і запис значення за адресою покажчика. Відзначимо, що хоча покажчики є посилальними типами, значення типу "покажчик" не є об'єктом, а отже, визначити точний тип такого значення неможливо.


Висновок


Ми ознайомилися з одним з основних компонентів Microsoft. NET Framework – середовищем виконання Common Language Runtime, розглянули такі теми, як виконувані файли і метадані, коротко поговорили про Microsoft Intermediate Language (MSIL), Just-In-Time Compiler, дізналися про призначення зборок і глобального кешу збірок (Global Assembly Cache). Потім ми докладно розглянули систему типів Common Type System і основні групи типів – дані зі значеннями і посилальні типи. Відзначимо, що підтримка типів на рівні Common Language Runtime забезпечує просту інтеграцію коду, написаного на різних мовах програмування. Питання про вибір мови програмування – будь то Visual Basic. NET, C # або будь-хто інший – не є першорядним, оскільки всі мови, що підтримують специфікацію Common Language Runtime, забезпечують доступ до розглянутих нами типів. Питання лише в синтаксичних особливостях тієї чи іншої мови.


Проілюструємо вищесказане. Розповідаючи про класи, властивості, методи і події, ми створили VB.NET-клас, який реалізує об'єкт TPoint, з двома властивостями – X і Y і методом SetXY, який дозволяє змінювати значення цих властивостей. При зміні значень властивостей X і Y виникає подія PTChanged. Створимо клієнтське додаток на C #, яке буде використовувати наш VB.NET-клас, і в ньому реалізуємо обробник події PTChanged. Нижче наведено фрагмент коду, що ілюструє необхідні дії:


public class Form1 : System.Windows.Forms.Form
{

               private ClassLibrary1.TPoint MyPoint;

               public Form1()
               {

               this.MyPoint = new ClassLibrary1.TPoint();
               MyPoint.PTChanged +=
new System.EventHandler (this.MyPoint_PTChanged);

}


private void button1_Click (object sender, System.EventArgs e)
               {
                    MyPoint.SetXY(10, 150);
               }
private void button2_Click (object sender, System.EventArgs e)
               {
                    MyPoint.SetXY(100, 250);
               }

private void button3_Click (object sender, System.EventArgs e)
               {
                    MyPoint.SetXY(50, 100);
               }
     void MyPoint_PTChanged(object sender, System.EventArgs e)
               {
               MessageBox.Show(“X=” + MyPoint.X.ToString(“G”) +
                         “, Y=” + MyPoint.Y.ToString(“G”),
                         “Changed”, MessageBoxButtons.OK);
               }
     }
}


У даному випадку необхідно лише створити Windows-додаток на C #, підключити посилання на бібліотеку класів, в якій описаний клас, який реалізує об'єкт TPoint, і описати об'єкт типу TPoint:


private ClassLibrary1.TPoint MyPoint;


Тепер викличемо конструктор об'єкта TPoint і опишемо новий обробник подій:


this.MyPoint = new ClassLibrary1.TPoint();
MyPoint.PTChanged += new
System.EventHandler(this.MyPoint_PTChanged);


Сам обробник подій реалізований в наступному методі:


void MyPoint_PTChanged(object sender, System.EventArgs e)
               {
               MessageBox.Show(
"X =" + MyPoint.X.ToString ("G") + ", Y =" +
                              MyPoint.Y.ToString(“G”),
                         “Changed”, MessageBoxButtons.OK);
               }


Ті, хто коли-небудь пробував використовувати в Visual Basic бібліотеки для C або інтегрувати код на Delphi з кодом на VB, зможуть по достоїнству оцінити зміни, привнесені Common Language Runtime.


У наступній статті ми почнемо ознайомлення з бібліотекою класів, розглянемо основні складові її простору імен і класи, а також наведемо деякі приклади їх використання.

Частина 3


Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*