Skip to content

4. کلاس‌های پرکاربرد .NET

در اینجا چند کلاس از پلتفرم .NET را معرفی می‌کنیم که حتی برای یک مبتدی نیز جالب هستند. ابتدا نشان می‌دهیم چگونه از صدها کلاس موجود مطلع شوید.

4.1. درخواست کمک با SDK.NET

4.1.1. wincv

اگر فقط SDK را نصب کرده و نه Visual Studio.NET را، می‌توانید از برنامه wincv.exe که معمولاً در ساختار پوشه SDK، برای مثال C:\Program Files\Microsoft Visual Studio قرار دارد، استفاده کنید.NET 2003\SDK\v1.1. وقتی این ابزار را اجرا می‌کنید، رابط کاربری زیر ظاهر می‌شود:

نام کلاس مورد نظر را در (۱) وارد کنید. این کار فهرستی از تم‌های ممکن را در (۲) نمایش می‌دهد. تم مناسب را انتخاب کنید و نتیجه در (۳) ظاهر می‌شود – در این مورد، کلاس HashTable. این روش زمانی مناسب است که نام کلاسی را که به دنبال آن هستید بدانید. اگر می‌خواهید فهرست گزینه‌های ارائه‌شده توسط . را کاوش کنید.NET، می‌توانید از فایل HTML StartHere.htm، که مستقیماً در پوشه نصب SSK.Net، برای مثال C:\Program Files\Microsoft Visual Studio .NET 2003\SDK\v1.

Image

لینک .NET Framework SDK Documentation همان لینکی است که باید دنبال کنید تا نمایی کلی از کلاس‌های .NET به دست آورید:

Image

از آنجا، پیوند [Bibliothèque de classes] را دنبال کنید. این شامل فهرستی از تمام کلاس‌های موجود در .NET است:

Image

برای مثال، بیایید لینک System.Collections را دنبال کنیم. این فضای نام شامل کلاس‌های مختلفی است که مجموعه‌ها را پیاده‌سازی می‌کنند، از جمله کلاس HashTable:

Image

بیایید لینک HashTable را در زیر دنبال کنیم:

Image

به صفحه زیر هدایت می‌شویم:

Image

به موقعیت نشانگر دست در زیر توجه کنید. این نشانگر به لینکی اشاره می‌کند که به شما امکان می‌دهد زبان مورد نظر، در این مورد ویژوال بیسیک، را مشخص کنید.

در اینجا پروتوتایپ کلاس و همچنین مثال‌هایی از نحوه استفاده از آن را خواهید یافت. بیایید لینک [Hashtable, membres] را در زیر دنبال کنیم:

Image

این توضیح کامل کلاس را ارائه می‌دهد:

Image

این بهترین راه برای کاوش SDK و کلاس‌های آن است. ابزار WinCV زمانی به کار می‌آید که شما قبلاً کمی درباره کلاس می‌دانید اما برخی از اعضای آن را فراموش کرده‌اید. سپس WinCV به شما امکان می‌دهد تا به سرعت کلاس و اعضای آن را پیدا کنید.

4.2. درخواست کمک برای کلاس‌ها با استفاده از VS.NET

در اینجا چند نکته برای یافتن راهنما در مورد Visual Studio.NET آورده شده است

4.2.1. گزینهٔ کمک

گزینه [?] را از منو انتخاب کنید.

Image

پنجره زیر ظاهر می‌شود:

Image

از فهرست کشویی می‌توانید یک فیلتر راهنما را انتخاب کنید. در اینجا، فیلتر [Visual Basic] را انتخاب می‌کنیم.

Image

دو موضوع کمکی مفید هستند:

  • راهنمای زبان VB.NET خود (دستور زبان)
  • راهنما در مورد عناصر classes.NET که می‌توان از آن‌ها با زبان VB.NET استفاده کرد

راهنمای زبان VB.NET را می‌توان از طریق [Visual Studio.NET/Visual Basic et Visual C#/Reference/Visual Basic] دسترسی داشت:

Image

این صفحهٔ راهنمای زیر را نمایش می‌دهد:

Image

از آنجا، بخش‌های فرعی مختلف راهنمایی‌هایی در مورد موضوعات گوناگون مرتبط با VB.NET ارائه می‌دهند. لطفاً توجه ویژه‌ای به آموزش‌های VB.NET داشته باشید:

Image

برای دسترسی به کلاس‌های مختلف در پلتفرم .NET، بخش راهنمای [Visual Studio.NET/.NET Framework] را انتخاب کنید.

Image

بخش [Référence/Bibliothèque de classes] از اهمیت ویژه‌ای برخوردار است:

Image

فرض کنید ما به کلاس [ArrayList] علاقه‌مند هستیم. این کلاس در فضای نام [System.Collections] قرار دارد. آگاهی از این موضوع مهم است؛ در غیر این صورت، بهتر است از روش جستجوی توصیف‌شده در زیر استفاده کنید. راهنمای زیر نمایش داده می‌شود:

Image

پیوند [ArrayList, classe] نمایی کلی از کلاس را ارائه می‌دهد:

Image

این نوع صفحه برای همه کلاس‌ها وجود دارد. این صفحه خلاصه‌ای از کلاس را همراه با مثال‌ها ارائه می‌دهد. برای توضیحات اعضای کلاس، به لینک [ArrayList, membres] مراجعه کنید:

Image

4.2.2. راهنما/فهرست

Image

گزینه [Aide/index] به شما امکان می‌دهد تا به جستجوی راهنمایی‌های دقیق‌تر نسبت به گزینه قبلی بپردازید. کافی است کلمه کلیدی مورد نظر خود را تایپ کنید:

Image

مزیت این روش نسبت به روش قبلی در این است که نیازی نیست بدانید اطلاعاتی که به دنبال آن هستید در کجای سیستم راهنما قرار دارد. این روش احتمالاً روش ترجیحی برای انجام یک جستجوی هدفمند است، در حالی که روش دیگر برای کاوش در تمام امکانات سیستم راهنما مناسب‌تر است.

4.3. کلاس String

کلاس String دارای خواص و متدهای متعددی است. در اینجا به چند مورد از آنها اشاره می‌شود:

Public ReadOnly Property Length As Integer
تعداد کاراکترها در رشته
Public Default ReadOnly Property 
Chars(ByVal index As Integer) As Char
ویژگی فهرست‌شده پیش‌فرض. [String].Chars(i) کاراکتر i-ام در رشته است
Public Function EndsWith(ByVal value As String) 
As Boolean
اگر رشته با مقدار پایان یابد، مقدار true را برمی‌گرداند
Public Function StartsWith(ByVal value As String) 
As Boolean
در صورتی که رشته با 'value' شروع شود، مقدار true را برمی‌گرداند
Overloads Public Function Equals(ByVal value 
As String) As Boolean
در صورتی که رشته با مقدار برابر باشد، مقدار true را برمی‌گرداند
Overloads Public Function IndexOf(ByVal value 
As String) As Integer
اولین رخداد رشته 'value' را در داخل رشته بازمی‌گرداند – جستجو از موقعیت کاراکتری 0 آغاز می‌شود
Overloads Public Function IndexOf(ByVal value 
As String,ByVal startIndex As Integer) As Integer
موقعیت اول در رشتهٔ 'value' را بازمی‌گرداند – جستجو از کاراکتر شماره startIndex شروع می‌شود
Overloads Public Shared Function 
Join(ByVal separator As String,ByVal value() 
As String) As String
متد کلاس – رشته‌ای را که از الحاق مقادیر در آرایه `value` با استفاده از `separator` حاصل شده، برمی‌گرداند.
Overloads Public Function Replace(ByVal oldChar 
As Char,ByVal newChar As Char) As String
یک رشته را بازمی‌گرداند که کپی‌ای از رشتهٔ فعلی است، که در آن کاراکتر oldChar با کاراکتر newChar جایگزین شده است
Overloads Public Function Split(ByVal ParamArray
separator() As Char) As String()
این رشته به‌عنوان دنباله‌ای از فیلدها در نظر گرفته می‌شود که با کاراکترهای آرایه `separator` از هم جدا شده‌اند. نتیجه، آرایه‌ای از این فیلدها است.
Overloads Public Function Substring(
ByVal startIndex As Integer,ByVal length As Integer) 
As String
یک زیر رشته‌ی رشته‌ی فعلی که از موقعیت startIndex شروع شده و شامل length کاراکتر است
Overloads Public Function ToLower() 
As String
رشتهٔ جاری را به حروف کوچک تبدیل می‌کند
Overloads Public Function ToUpper() 
As String
متن فعلی را به حروف بزرگ تبدیل می‌کند
Overloads Public Function Trim() 
As String
فاصله‌های خالی ابتدایی و انتهایی را از رشتهٔ جاری حذف می‌کند

یک رشته C را می‌توان به‌عنوان یک آرایه از کاراکترها در نظر گرفت. بنابراین

  • C.Chars(i) کاراکتر i-ام در C است
  • C.Length تعداد کاراکترهای C است

مثال زیر را در نظر بگیرید:


' گزینه‌ها
Option Strict On
Option Explicit On 

' فضاهای نام
Imports System

Module test
    Sub Main()
        Dim uneChaine As String = "l'oiseau vole au-dessus des nuages"
        affiche("uneChaine=" + uneChaine)
        affiche("uneChaine.Length=" & uneChaine.Length)
        affiche("chaine[10]=" + uneChaine.Chars(10))
        affiche("uneChaine.IndexOf(""vole"")=" & uneChaine.IndexOf("vole"))
        affiche("uneChaine.IndexOf(""x"")=" & uneChaine.IndexOf("x"))
        affiche("uneChaine.LastIndexOf('a')=" & uneChaine.LastIndexOf("a"c))
        affiche("uneChaine.LastIndexOf('x')=" & uneChaine.LastIndexOf("x"c))
        affiche("uneChaine.Substring(4,7)=" + uneChaine.Substring(4, 7))
        affiche("uneChaine.ToUpper()=" + uneChaine.ToUpper())
        affiche("uneChaine.ToLower()=" + uneChaine.ToLower())
        affiche("uneChaine.Replace('a','A')=" + uneChaine.Replace("a"c, "A"c))
        Dim champs As String() = uneChaine.Split(Nothing)
        Dim i As Integer
        For i = 0 To champs.Length - 1
            affiche("champs[" & i & "]=[" & champs(i) & "]")
        Next i
        affiche("Join("":"",champs)=" + System.String.Join(":", champs))
        affiche("(""  abc  "").Trim()=[" + "  abc  ".Trim() + "]")
    End Sub

    ' نمایش می‌دهد
    Sub affiche(ByVal msg As [String])
        ' پیام را نمایش می‌دهد
        Console.Out.WriteLine(msg)
    End Sub
End Module

اجرا نتایج زیر را تولید می‌کند:

dos>vbc string1.vb

dos>string1
uneChaine=l'oiseau vole au-dessus des nuages
uneChaine.Length=34
chaine[10]=o
uneChaine.IndexOf("vole")=9
uneChaine.IndexOf("x")=-1
uneChaine.LastIndexOf('a')=30
uneChaine.LastIndexOf('x')=-1
uneChaine.Substring(4,7)=seau vo
uneChaine.ToUpper()=L'OISEAU VOLE AU-DESSUS DES NUAGES
uneChaine.ToLower()=l'oiseau vole au-dessus des nuages
uneChaine.Replace('a','A')=l'oiseAu vole Au-dessus des nuAges
champs[0]=[l'oiseau]
champs[1]=[vole]
champs[2]=[au-dessus]
champs[3]=[des]
champs[4]=[nuages]
Join(":",champs)=l'oiseau:vole:au-dessus:des:nuages
("  abc  ").Trim()=[abc]

بیایید مثال دیگری را در نظر بگیریم:


' گزینه‌ها
Option Strict On
Option Explicit On 

' فضاهای نام
Imports System

Module string2
    Sub Main()
        ' خطی که باید تحلیل شود
        Dim ligne As String = "un:deux::trois:"
        'جداکننده‌های فیلد
        Dim séparateurs() As Char = {":"c}
        ' تقسیم
        Dim champs As String() = ligne.Split(séparateurs)
        Dim i As Integer
        For i = 0 To champs.Length - 1
            Console.Out.WriteLine(("Champs[" & i & "]=" & champs(i)))
        Next i
        ' پیوند
        Console.Out.WriteLine(("join=[" + System.String.Join(":", champs) + "]"))
    End Sub
End Module

و نتایج اجرا:

Champs[0]=un
Champs[1]=deux
Champs[2]=
Champs[3]=trois
Champs[4]=
join=[un:deux::trois:]

متد Split کلاس String برای تقسیم فیلدهای یک رشتهٔ کاراکتری به یک آرایه استفاده می‌شود. تعریف متد مورد استفاده در اینجا به شرح زیر است:

Overloads Public Function Split(ByVal ParamArray separator() As Char) As String()
separator
یک آرایه از کاراکترها. این کاراکترها نمایانگر کاراکترهای مورد استفاده برای جدا کردن فیلدها در رشته هستند. بنابراین، اگر رشته [champ1, champ2, champ3] باشد، می‌توان از `separator=new char() {","c}` استفاده کرد. اگر جداکننده یک دنباله از فاصله‌ها باشد، از separator=nothing استفاده می‌شود.
résultat
یک آرایه از رشته‌ها که هر عنصر آن یک فیلد در رشته است.

متد **Join** یک متد استاتیک از کلاس String است:

Overloads Public Shared Function Join(ByVal separator As String,ByVal value() As String) As String
value
آرایه‌ای از رشته‌ها
separator
یک رشته برای استفاده به عنوان جداکننده فیلد
résultat
یک رشته که با الحاق عناصر آرایه value، که توسط رشته separator از هم جدا شده‌اند، تشکیل شده است.

4.4. کلاس Array

کلاس Array یک آرایه را پیاده‌سازی می‌کند. در مثال ما، از ویژگی‌ها و متدهای زیر استفاده خواهیم کرد:

Public ReadOnly Property Length As Integer
خصلت – تعداد عناصر آرایه
Overloads Public Shared Function BinarySearch
(ByVal array As Array,ByVal index As Integer,
ByVal length As Integer,ByVal value As Object) As Integer
متد کلاس – موقعیت value را در آرایه مرتب‌شده array بازمی‌گرداند – از موقعیت index و با length عنصر جستجو می‌کند
Overloads Public Shared Sub Copy(ByVal sourceArray 
As Array,ByVal destinationArray As Array,
ByVal length As Integer)
متد کلاس – عناصر را از sourceArray تا destinationArray کپی می‌کند – destinationArray در این فرآیند ایجاد می‌شود
Overloads Public Shared Sub Sort(ByVal array As Array)
متد کلاس – آرایه array را مرتب می‌کند – این باید شامل یک نوع داده با تابع مرتب‌سازی پیش‌فرض باشد (رشته‌ها، اعداد).

برنامه زیر کاربرد کلاس Array را نشان می‌دهد:


' گزینه‌ها
Option Strict On
Option Explicit On 

' فضاهای نام
Imports System

Module test
    Sub Main()
        'خواندن عناصر آرایه واردشده از طریق صفحه‌کلید
        Dim terminé As [Boolean] = False
        Dim i As Integer = 0
        Dim éléments1 As Double() = Nothing
        Dim éléments2 As Double() = Nothing
        Dim élément As Double = 0
        Dim réponse As String = Nothing
        Dim erreur As [Boolean] = False

        While Not terminé
            ' سوال
            Console.Out.Write(("Elément (réel) " & i & " du tableau (rien pour terminer) : "))
            ' خواندن پاسخ
            réponse = Console.ReadLine().Trim()
            'پایان ورودی اگر رشته خالی باشد
            If réponse.Equals("") Then
                Exit While
            End If
            ' بررسی ورودی
            Try
                élément = [Double].Parse(réponse)
                erreur = False
            Catch
                Console.Error.WriteLine("Saisie incorrecte, recommencez")
                erreur = True
            End Try
            ' اگر خطایی وجود نداشته باشد
            If Not erreur Then
                ' آرایهٔ جدید برای نگهداری عنصر جدید
                éléments2 = New Double(i) {}
                ' کپی آرایه قدیمی در آرایه جدید
                If i <> 0 Then
                    Array.Copy(éléments1, éléments2, i)
                End If
                ' آرایهٔ جدید به آرایهٔ قدیمی تبدیل می‌شود
                éléments1 = éléments2
                ' آرایه جدید دیگر مورد نیاز نیست
                éléments2 = Nothing
                ' افزودن عنصر جدید
                éléments1(i) = élément
                'یک عنصر دیگر در آرایه
                i += 1
            End If
        End While
        'نمایش آرایهٔ مرتب‌نشده
        System.Console.Out.WriteLine("Tableau non trié")
        For i = 0 To éléments1.Length - 1
            Console.Out.WriteLine(("éléments[" & i & "]=" & éléments1(i)))
        Next i
        'مرتب‌سازی جدول
        System.Array.Sort(éléments1)
        'نمایش جدول مرتب‌شده
        System.Console.Out.WriteLine("Tableau trié")
        For i = 0 To éléments1.Length - 1
            Console.Out.WriteLine(("éléments[" & i & "]=" & éléments1(i)))
        Next i
        'جستجو
        While Not terminé
            ' سؤال
            Console.Out.Write("Elément cherché (rien pour arrêter) : ")
            ' خواندن و بررسی پاسخ
            réponse = Console.ReadLine().Trim()
            ' تمام شد؟
            If réponse.Equals("") Then
                Exit While
            End If
            'بررسی
            Try
                élément = [Double].Parse(réponse)
                erreur = False
            Catch
                Console.Error.WriteLine("Saisie incorrecte, recommencez")
                erreur = True
            End Try
            ' اگر خطایی وجود نداشته باشد
            If Not erreur Then
                ' جستجوی عنصر در آرایه مرتب‌شده
                i = System.Array.BinarySearch(éléments1, 0, éléments1.Length, élément)
                ' نمایش پاسخ
                If i >= 0 Then
                    Console.Out.WriteLine(("Trouvé en position " & i))
                Else
                    Console.Out.WriteLine("Pas dans le tableau")
                End If
            End If
        End While
    End Sub
End Module

خروجی صفحه به شرح زیر است:

Elément (réel) 0 du tableau (rien pour terminer) : 10,4
Elément (réel) 1 du tableau (rien pour terminer) : 5,2
Elément (réel) 2 du tableau (rien pour terminer) : 8,7
Elément (réel) 3 du tableau (rien pour terminer) : 3,6
Elément (réel) 4 du tableau (rien pour terminer) :
Tableau non trié
éléments[0]=10,4
éléments[1]=5,2
éléments[2]=8,7
éléments[3]=3,6
Tableau trié
éléments[0]=3,6
éléments[1]=5,2
éléments[2]=8,7
éléments[3]=10,4
Elément cherché (rien pour arrêter) : 8,7
Trouvé en position 2
Elément cherché (rien pour arrêter) : 11
Pas dans le tableau
Elément cherché (rien pour arrêter) : a
Saisie incorrecte, recommencez
Elément cherché (rien pour arrêter) :

بخش اول برنامه یک آرایه از داده‌های عددی واردشده از طریق صفحه‌کلید ایجاد می‌کند. اندازهٔ این آرایه را نمی‌توان از پیش تعیین کرد، زیرا تعداد عناصری که کاربر وارد خواهد کرد نامشخص است. بنابراین ما با دو آرایه کار می‌کنیم: éléments1 و éléments2.


                ' آرایهٔ جدید برای نگهداری عنصر جدید
                éléments2 = New Double(i) {}
                ' کپی آرایه قدیمی در آرایه جدید
                If i <> 0 Then
                    Array.Copy(éléments1, éléments2, i)
                End If
                ' آرایهٔ جدید به آرایهٔ قدیمی تبدیل می‌شود
                éléments1 = éléments2
                ' دیگر به جدول جدید نیازی نیست
                éléments2 = Nothing
                ' افزودن عنصر جدید
                éléments1(i) = élément
                'یک عنصر دیگر در جدول
                i += 1

آرایه éléments1 حاوی مقادیر وارد شده در حال حاضر است. هنگامی که کاربر مقدار جدیدی اضافه می‌کند، یک آرایه éléments2 با یک عنصر بیشتر از éléments1 ایجاد می‌شود، محتویات éléments1 به éléments2 (Array.Copy) کپی می‌شود، ما éléments1 را به éléments2 «اشاره» می‌دهیم، و در نهایت عنصر جدید را به éléments1 اضافه می‌کنیم. این یک فرآیند پیچیده است که در صورت استفاده از یک آرایه با اندازه متغیر (ArrayList) به جای یک آرایه با اندازه ثابت (Array)، می‌توان آن را ساده‌تر کرد.

این آرایه با استفاده از روش Array.Sort مرتب می‌شود. این روش را می‌توان با پارامترهای مختلف که قواعد مرتب‌سازی را مشخص می‌کنند، فراخوانی کرد. بدون پارامتر، مرتب‌سازی به‌صورت صعودی پیش‌فرض انجام می‌شود. در نهایت، روش Array.BinarySearch به شما امکان می‌دهد در یک آرایه مرتب‌شده به دنبال یک عنصر بگردید.

4.5. کلاس ArrayList

کلاس ArrayList امکان پیاده‌سازی آرایه‌هایی با اندازه متغیر را در حین اجرای برنامه فراهم می‌کند، که این امر با کلاس قبلی Array امکان‌پذیر نبود. در اینجا برخی از ویژگی‌ها و متدهای رایج آورده شده است:

Public Sub New()
یک لیست خالی ایجاد می‌کند
Public Overridable ReadOnly Property Count 
As Integer  Implements ICollection.Count
تعداد آیتم‌های مجموعه
Public Overridable Function Add(ByVal value 
As Object) As Integer Implements IList.Add
اضافه کردن شیء مقدار به انتهای مجموعه
Public Overridable Sub Clear() 
Implements IList.Clear
فهرست را پاک می‌کند
Overloads Public Overridable Function 
IndexOf(ByVal value As Object) As Integer 
Implements IList.IndexOf
شاخص شیء «value» در لیست، یا -1 اگر وجود نداشته باشد
Overloads Public Overridable Function 
IndexOf(ByVal value As Object, ByVal startIndex 
As Integer) As Integer
همانند بالا، اما جستجو از عنصر شماره startIndex
Overloads Public Overridable Function 
LastIndexOf(ByVal value As Object) As Integer
همانند مورد بالا، اما شاخص آخرین رخداد 'value' در لیست را برمی‌گرداند
Overloads Public Overridable Function 
LastIndexOf(ByVal value As Object, ByVal startIndex As Integer) As Integer
همانند مورد بالا، اما جستجو از عنصر شماره startIndex انجام می‌شود
Public Overridable Sub Remove( ByVal obj As Object)
Implements IList.Remove
شیء 'obj' را در صورت وجود در لیست حذف می‌کند
Public Overridable Sub RemoveAt(ByVal index As Integer) 
Implements IList.RemoveAt
عنصر با شاخص را از لیست حذف می‌کند
Overloads Public Overridable Function 
BinarySearch(ByVal value As Object) As Integer
موقعیت شیء «value» را در لیست برمی‌گرداند، یا در صورت عدم وجود -1 را برمی‌گرداند. لیست باید مرتب باشد.
Overloads Public Overridable Sub Sort()
فهرست را مرتب می‌کند. فهرست باید شامل اشیایی با ترتیب از پیش تعریف‌شده (رشته‌ها، اعداد) باشد.
Overloads Public Overridable Sub 
Sort(ByVal comparer As IComparer)
فهرست را بر اساس ترتیب تعیین‌شده توسط تابع مقایسه مرتب می‌کند

بیایید مثال را با استفاده از اشیاء از نوع Array مجدداً بررسی کنیم و آن را با استفاده از اشیاء از نوع ArrayList پردازش کنیم:


' گزینه‌ها
Option Strict On
Option Explicit On 

' فضاهای نام
Imports System
Imports System.Collections

Module test
    Sub Main()
        ' خواندن عناصر آرایه وارد شده از طریق صفحه‌کلید
        Dim terminé As [Boolean] = False
        Dim i As Integer = 0
        Dim éléments As New ArrayList
        Dim élément As Double = 0
        Dim réponse As String = Nothing
        Dim erreur As [Boolean] = False

        While Not terminé
            ' سؤال
            Console.Out.Write(("Elément (réel) " & i & " du tableau (rien pour terminer) : "))
            ' خواندن پاسخ
            réponse = Console.ReadLine().Trim()
            'پایان ورودی اگر رشته خالی باشد
            If réponse.Equals("") Then
                Exit While
            End If
            ' بررسی ورودی
            Try
                élément = Double.Parse(réponse)
                erreur = False
            Catch
                Console.Error.WriteLine("Saisie incorrecte, recommencez")
                erreur = True
            End Try
            ' اگر خطایی وجود نداشته باشد
            If Not erreur Then
                ' افزودن یک عنصر دیگر به آرایه
                éléments.Add(élément)
            End If
        End While
        ' نمایش آرایه مرتب‌نشده
        System.Console.Out.WriteLine("Tableau non trié")
        For i = 0 To éléments.Count - 1
            Console.Out.WriteLine(("éléments[" & i & "]=" & éléments(i).ToString))
        Next i        ' tri du tableau
        éléments.Sort()
        ' نمایش آرایه مرتب‌شده
        System.Console.Out.WriteLine("Tableau trié")
        For i = 0 To éléments.Count - 1
            Console.Out.WriteLine(("éléments[" & i & "]=" & éléments(i).ToString))
        Next i
        'جستجو
        While Not terminé
            ' سوال
            Console.Out.Write("Elément cherché (rien pour arrêter) : ")
            ' خواندن و بررسی پاسخ
            réponse = Console.ReadLine().Trim()
            ' تمام شد؟
            If réponse.Equals("") Then
                Exit While
            End If
            'بررسی
            Try
                élément = [Double].Parse(réponse)
                erreur = False
            Catch
                Console.Error.WriteLine("Saisie incorrecte, recommencez")
                erreur = True
            End Try
            ' اگر خطا وجود نداشته باشد
            If Not erreur Then
                ' جستجوی عنصر در آرایه مرتب‌شده
                i = éléments.BinarySearch(élément)
                ' نمایش پاسخ
                If i >= 0 Then
                    Console.Out.WriteLine(("Trouvé en position " & i))
                Else
                    Console.Out.WriteLine("Pas dans le tableau")
                End If
            End If
        End While
    End Sub
End Module

نتایج اجرا به شرح زیر است:

Elément (réel) 0 du tableau (rien pour terminer) : 10,4
Elément (réel) 0 du tableau (rien pour terminer) : 5,2
Elément (réel) 0 du tableau (rien pour terminer) : a
Saisie incorrecte, recommencez
Elément (réel) 0 du tableau (rien pour terminer) : 3,7
Elément (réel) 0 du tableau (rien pour terminer) : 15
Elément (réel) 0 du tableau (rien pour terminer) :
Tableau non trié
éléments[0]=10,4
éléments[1]=5,2
éléments[2]=3,7
éléments[3]=15
Tableau trié
éléments[0]=3,7
éléments[1]=5,2
éléments[2]=10,4
éléments[3]=15
Elément cherché (rien pour arrêter) : a
Saisie incorrecte, recommencez
Elément cherché (rien pour arrêter) : 15
Trouvé en position 3
Elément cherché (rien pour arrêter) : 1
Pas dans le tableau
Elément cherché (rien pour arrêter) :

4.6. کلاس Hashtable

کلاس Hashtable برای پیاده‌سازی یک دیکشنری استفاده می‌شود. یک دیکشنری را می‌توان به صورت یک آرایه دو ستونی در نظر گرفت:

کلیدها منحصربه‌فرد هستند، c.a.d، به این معنی که هیچ دو کلیدی نمی‌توانند یکسان باشند. روش‌ها و ویژگی‌های اصلی کلاس Hashtable به شرح زیر است:

Public Sub New()
ایجاد یک دیکشنری خالی
Public Overridable Sub Add(ByVal key As
Object,ByVal value As Object) 
Implements IDictionary.Add
یک ورودی (کلید، مقدار) به دیکشنری اضافه می‌کند، که در آن کلید و مقدار ارجاع به شی هستند.
Public Overridable Sub Remove
(ByVal key As Object) Implements IDictionary.Remove
ورودی key=key را از دیکشنری حذف می‌کند
Public Overridable Sub Clear() 
Implements IDictionary.Clear
واژه‌نامه را پاک می‌کند
Public Overridable Function ContainsKey
(ByVal key As Object) As Boolean
اگر کلید 'key' در دیکشنری وجود داشته باشد، مقدار true را برمی‌گرداند.
Public Overridable Function 
ContainsValue(ByVal value As Object) As Boolean
اگر مقدار 'value' در دیکشنری موجود باشد، مقدار true را برمی‌گرداند.
Public Overridable ReadOnly Property 
Count As Integer  Implements ICollection.Count
ویژگی: تعداد عناصر در دیکشنری (کلید، مقدار)
Public Overridable ReadOnly Property 
Keys As ICollection Implements IDictionary.Keys
ویژگی: مجموعه کلیدهای دیکشنری
Public Overridable ReadOnly Property 
Values As ICollection Implements IDictionary.Values
خواصیت: مجموعه مقادیر دیکشنری
Public Overridable Default Property 
Item(ByVal key As Object) As Object  Implements IDictionary.Item
ویژگی شاخص‌دار: به شما امکان می‌دهد مقدار مرتبط با یک کلید را بازیابی یا تنظیم کنید

برنامهٔ نمونهٔ زیر را در نظر بگیرید:


' گزینه‌ها
Option Strict On
Option Explicit On 

' فضاهای نام
Imports System
Imports System.Collections

Module test
    Sub Main()
        Dim liste() As [String] = {"jean:20", "paul:18", "mélanie:10", "violette:15"}
        Dim i As Integer
        Dim champs As [String]() = Nothing
        Dim séparateurs() As Char = {":"c}
        ' پر کردن دیکشنری
        Dim dico As New Hashtable
        For i = 0 To liste.Length - 1
            champs = liste(i).Split(séparateurs)
            dico.Add(champs(0), champs(1))
        Next i
        ' تعداد عناصر در دیکشنری
        Console.Out.WriteLine(("Le dictionnaire a " & dico.Count & " éléments"))
        ' فهرست کلیدها
        Console.Out.WriteLine("[Liste des clés]")
        Dim clés As IEnumerator = dico.Keys.GetEnumerator()
        While clés.MoveNext()
            Console.Out.WriteLine(clés.Current)
        End While
        ' فهرست مقادیر
        Console.Out.WriteLine("[Liste des valeurs]")
        Dim valeurs As IEnumerator = dico.Values.GetEnumerator()
        While valeurs.MoveNext()
            Console.Out.WriteLine(valeurs.Current)
        End While
        ' فهرست کلیدها و مقادیر
        Console.Out.WriteLine("[Liste des clés & valeurs]")
        clés.Reset()
        While clés.MoveNext()
            Console.Out.WriteLine(("clé=" & clés.Current.ToString & " valeur=" & dico(clés.Current).ToString))
        End While
        'کلید «paul» حذف شده است
        Console.Out.WriteLine("[Suppression d'une clé]")
        dico.Remove("paul")
        ' فهرست کلیدها و مقادیر
        Console.Out.WriteLine("[Liste des clés & valeurs]")
        clés = dico.Keys.GetEnumerator()
        While clés.MoveNext()
            Console.Out.WriteLine(("clé=" & clés.Current.ToString & " valeur=" & dico(clés.Current).ToString))
        End While

        ' جستجو در فرهنگ لغت
        Dim nomCherché As [String] = Nothing
        Console.Out.Write("Nom recherché (rien pour arrêter) : ")
        nomCherché = Console.ReadLine().Trim()
        Dim value As [Object] = Nothing
        While Not nomCherché.Equals("")
            If dico.ContainsKey(nomCherché) Then
                value = dico(nomCherché)
                Console.Out.WriteLine((nomCherché + "," + CType(value, [String])))
            Else
                Console.Out.WriteLine(("Nom " + nomCherché + " inconnu"))
            End If
            ' جستجوی بعدی
            Console.Out.Write("Nom recherché (rien pour arrêter) : ")
            nomCherché = Console.ReadLine().Trim()
        End While
    End Sub
End Module

نتایج اجرا به شرح زیر است:

Le dictionnaire a 4 éléments
[Liste des clés]
mélanie
paul
violette
jean
[Liste des valeurs]
10
18
15
20
[Liste des clés & valeurs]
clé=mélanie valeur=10
clé=paul valeur=18
clé=violette valeur=15
clé=jean valeur=20
[Suppression d'une clé]
[Liste des clés & valeurs]
clé=mélanie valeur=10
clé=violette valeur=15
clé=jean valeur=20
Nom recherché (rien pour arrêter) : paul
Nom paul inconnu
Nom recherché (rien pour arrêter) : mélanie
mélanie,10
Nom recherché (rien pour arrêter) :

این برنامه همچنین از یک شی IEnumerator برای تکرار در مجموعه کلیدها و مقادیر در فرهنگ لغت ICollection استفاده می‌کند (به خواص Keys و Values در بالا مراجعه کنید). یک مجموعه (collection) مجموعه‌ای از اشیاء است که می‌توان بر روی آن‌ها حلقه‌ای اجرا کرد. رابط ICollection به صورت زیر تعریف شده است:

Image

ویژگی Count به ما امکان می‌دهد تعداد عناصر مجموعه را تعیین کنیم. رابط ICollection از رابط IEnumerable ارث می‌برد:

Image

این رابط تنها یک متد دارد، GetEnumerator، که به ما امکان می‌دهد یک شی از نوع IEnumerator را به دست آوریم:

Image

متد GetEnumerator() یک مجموعه ICollection به ما امکان می‌دهد تا با استفاده از روش‌های زیر در مجموعه تکرار کنیم:

MoveNext
به عنصر بعدی در مجموعه منتقل می‌شود. اگر این عنصر وجود داشته باشد مقدار true و در غیر این صورت مقدار false را برمی‌گرداند. اولین MoveNext به اولین عنصر منتقل می‌شود. عنصر «جاری» مجموعه سپس در خصوصیت Current ایتراتور در دسترس است.
Current
ویژگی: عنصر جاری مجموعه
Reset
نشانگر را در ابتدای مجموعه، c.a.d، قبل از اولین عنصر قرار می‌دهد.

بنابراین ساختار برای تکرار بر روی عناصر یک مجموعه (ICollection) در C به شرح زیر است:

' تعریف مجموعه
dim C as ICollection C=...
' دریافت یک ایتراتور برای این مجموعه
dim itérateur as IEnumerator=C.GetEnumerator();
' با استفاده از این ایتراتور، مجموعه را به‌صورت متوالی طی کنید
while(itérateur.MoveNext())
    ' ما یک عنصر جاری داریم
     ' پردازش QZXW2HTMLCaXTDqXJhdGV1ci.CdXJyZW50ZQX
end while

4.7. کلاس StreamReader

کلاس StreamReader به شما امکان می‌دهد محتوای یک فایل را بخوانید. در اینجا برخی از ویژگی‌ها و متدهای آن آمده است:

Public Sub New(ByVal path As String)
یک استریم از مسیر فایل باز می‌کند. اگر فایل وجود نداشته باشد، یک استثنا پرتاب می‌شود
Overrides Public Sub Close()
جریان را می‌بندد
Overrides Public Function ReadLine() As String
یک خط را از جریان بازخوانی می‌کند
Overrides Public Function ReadToEnd() As String
بقیهٔ جریان را از موقعیت فعلی می‌خواند

در اینجا یک مثال آورده شده است:


' گزینه‌ها
Option Strict On
Option Explicit On 

' فضاهای نام
Imports System
Imports System.Collections
Imports System.IO

Module test
    Sub Main()
        Dim ligne As String = Nothing
        Dim fluxInfos As StreamReader = Nothing
        ' خواندن محتویات فایل
        Try
            fluxInfos = New StreamReader("infos.txt")
            ligne = fluxInfos.ReadLine()
            While Not (ligne Is Nothing)
                System.Console.Out.WriteLine(ligne)
                ligne = fluxInfos.ReadLine()
            End While
        Catch e As Exception
            System.Console.Error.WriteLine("L'erreur suivante s'est produite : " & e.ToString)
        Finally
            Try
                fluxInfos.Close()
            Catch
            End Try
        End Try
    End Sub
End Module

و نتایج اجرای آن:

dos>more infos.txt
12620:0:0
13190:0,05:631
15640:0,1:1290,5
24740:0,15:2072,5
31810:0,2:3309,5
39970:0,25:4900
48360:0,3:6898,5
55790:0,35:9316,5
92970:0,4:12106
127860:0,45:16754,5
151250:0,5:23147,5
172040:0,55:30710
195000:0,6:39312
0:0,65:49062

dos>file1
12620:0:0
13190:0,05:631
15640:0,1:1290,5
24740:0,15:2072,5
31810:0,2:3309,5
39970:0,25:4900
48360:0,3:6898,5
55790:0,35:9316,5
92970:0,4:12106
127860:0,45:16754,5
151250:0,5:23147,5
172040:0,55:30710
195000:0,6:39312
0:0,65:49062

4.8. کلاس StreamWriter

کلاس StreamWriter به شما امکان می‌دهد تا در یک فایل بنویسید. در اینجا برخی از ویژگی‌ها و متدهای آن آورده شده است:

Public Sub New(ByVal path As String)
یک جریان نوشتن از مسیر فایل باز می‌کند. اگر فایل قابل ایجاد نباشد، یک استثنا پرتاب می‌شود.
Public Overridable Property AutoFlush 
As Boolean
اگر روی true تنظیم شود، نوشتن در استریم از طریق بافر انجام نمی‌شود؛ در غیر این صورت، نوشتن در استریم فوری نخواهد بود: داده‌ها ابتدا در یک بافر نوشته می‌شوند و سپس هنگامی که بافر پر شود، به استریم نوشته می‌شوند. به طور پیش‌فرض، حالت بافر شده استفاده می‌شود. این حالت برای استریم‌های فایل مناسب است اما به طور کلی برای استریم‌های شبکه مناسب نیست.
Public Overridable Property NewLine 
As String
برای تعیین یا مشخص کردن کاراکتر پایان خط مورد استفاده توسط متد WriteLine
Overrides Public Sub Close()
جریان را می‌بندد
Overloads Public Overridable Sub 
WriteLine(ByVal value As String)
یک خط را به جریان خروجی می‌نویسد
Overrides Public Sub Flush()
فایل بافر را به استریم می‌نویسد

مثال زیر را در نظر بگیرید:


' گزینه‌ها
Option Strict On
Option Explicit On 

' فضاهای نام
Imports System
Imports System.Collections
Imports System.IO

Module test
    Sub Main()
        Dim ligne As String = Nothing        ' une ligne de texte
        Dim fluxInfos As StreamWriter = Nothing        ' le fichier texte
        Try
            'ایجاد یک فایل متنی
            fluxInfos = New StreamWriter("infos.txt")
            ' خواندن یک خط تایپ‌شده روی صفحه‌کلید
            Console.Out.Write("ligne (rien pour arrêter) : ")
            ligne = Console.In.ReadLine().Trim()
            ' حلقه تا زمانی که خط وارد شده خالی نباشد
            While ligne <> ""
                'نوشتن یک خط در یک فایل متنی
                fluxInfos.WriteLine(ligne)
                'خواندن خط جدید از صفحه‌کلید
                Console.Out.Write("ligne (rien pour arrêter) : ")
                ligne = Console.In.ReadLine().Trim()
            End While
        Catch e As Exception
            System.Console.Error.WriteLine("L'erreur suivante s'est produite : " & e.ToString)
        Finally
            ' بستن فایل
            Try
                fluxInfos.Close()
            Catch
            End Try
        End Try
    End Sub
End Module

و نتایج اجرای آن:

dos>file2
ligne (rien pour arrêter) : ligne1
ligne (rien pour arrêter) : ligne2
ligne (rien pour arrêter) : ligne3
ligne (rien pour arrêter) :

dos>more infos.txt
ligne1
ligne2
ligne3

4.9. کلاس Regex

کلاس Regex امکان استفاده از عبارت‌های منظم را فراهم می‌کند. این‌ها به شما اجازه می‌دهند تا قالب یک رشته را اعتبارسنجی کنید. به عنوان مثال، می‌توانید بررسی کنید که یک رشته که نشان‌دهنده یک تاریخ است، واقعاً در قالب dd/mm/yy باشد. برای این کار، شما از یک الگو استفاده کرده و رشته را با آن الگو مقایسه می‌کنید. در این مثال، d، m و y باید اعداد باشند. الگوی یک فرمت تاریخ معتبر بنابراین «\d\d/\d\d/\d\d» است، که در آن نماد \d نشان‌دهنده یک رقم است. نمادهایی که می‌توان در یک الگو استفاده کرد به شرح زیر است (مستندات مایکروسافت):

 
توضیحات
\ 
کاراکترهای زیر را به عنوان کاراکتر ویژه یا متن مطلق علامت‌گذاری کنید. برای مثال، «n» با کاراکتر «n» مطابقت دارد. «\n» با کاراکتر خط جدید مطابقت دارد. توالی «\\» با «\» مطابقت دارد، در حالی که «\(" با «(» مطابقت دارد.
^ 
با شروع ورودی مطابقت دارد.
$ 
نماینده پایان ورودی است.
* 
با کاراکتر قبلی صفر یا چند بار مطابقت دارد. بنابراین، 'zo*' با 'z' یا 'zoo' مطابقت دارد.
+ 
با کاراکتر قبلی یک یا چند بار مطابقت دارد. بنابراین، «zo+» با «zoo» مطابقت دارد، اما با «z» مطابقت ندارد.
? 
با کاراکتر قبلی صفر یا یک بار مطابقت می‌دهد. برای مثال، «a?ve?» با «ve» در «lever» مطابقت دارد.
.
با هر کاراکتر واحدی مطابقت دارد، به جز کاراکتر خط جدید.

(modèle) 
جستجو برای modèle و ذخیره تطبیق. زیر رشته‌ی تطبیق‌شده را می‌توان از مجموعه Matches حاصل با استفاده از آیتم [0]...[n] استخراج کرد. برای یافتن تطابق‌هایی که شامل کاراکترها در داخل پرانتز ( ) هستند، از "(" یا ")" استفاده کنید.

x|y
مطابقت می‌کند با x یا y. برای مثال، "z|foot" با "z" یا "foot" مطابقت دارد. "(z|f)oo" با "zoo" یا "foo" مطابقت دارد.

{n}
n یک عدد صحیح غیرمنفی است. دقیقاً به همان تعداد n بار با کاراکتر مطابقت دارد. برای مثال، «o{2}» با «o» در «Bob» مطابقت ندارد، اما با دو «o» اول در «fooooot» مطابقت دارد.

{n,} 
n یک عدد صحیح غیرمنفی است. این عبارت حداقل به n بار با این کاراکتر مطابقت دارد. برای مثال، «o{2,}» با «o» در «Bob» مطابقت ندارد، اما با تمام «o»ها در «fooooot» مطابقت دارد. «o{1,}» معادل «o+» و «o{0,}» معادل «o*» است.

{n,m} 
m و n اعداد صحیح غیرمنفی هستند. با کاراکتر حداقل n و حداکثر m بار مطابقت می‌دهد. برای مثال، «o{1,3}» با سه «o» اول در «foooooot» مطابقت دارد و «o{0,1}» معادل «o؟» است.

[xyz] 
مجموعه کاراکتر. یکی از کاراکترهای مشخص‌شده را مطابقت می‌دهد. برای مثال، «[abc]» با «a» در «plat» مطابقت دارد.

[^xyz] 
مجموعه کاراکتر منفی. با هر کاراکتری که در لیست ذکر نشده مطابقت دارد. برای مثال، "[^abc]" با "p" در "plat" مطابقت دارد.

[a-z] 
محدوده کاراکتری. با هر کاراکتری که در محدوده مشخص شده باشد مطابقت دارد. برای مثال، "[a-z]" با هر کاراکتر الفبایی کوچک بین "a" و "z" مطابقت دارد.

[^m-z] 
محدوده کاراکتری منفی. با هر کاراکتری مطابقت دارد که در محدوده مشخص‌شده یافت نشود. برای مثال، «[^m-z]» با هر کاراکتری مطابقت دارد که بین «m» و «z» یافت نشود.
\b 
مطابقت می‌دهد با مرز کلمه، یعنی موقعیت بین یک کلمه و یک فاصله. برای مثال، «er\b» با «er» در «lever» مطابقت دارد، اما با «er» در «verbe» مطابقت ندارد.
\B 
یک مرز را مطابقت می‌دهد که نمایانگر یک کلمه نیست. «en*t\B» با «ent» در «bien entendu» مطابقت دارد.
\d 
با یک کاراکتر نمایانگر یک رقم مطابقت دارد. معادل [0-9] است.
\D 
مطابقت می‌دهد با یک کاراکتر که نمایانگر یک رقم نیست. معادل [^0-9] است.
\f 
مطابق با یک کاراکتر شکست صفحه است.
\n 
مطابقت دارد با کاراکتر پایان خط.
\r 
مطابق با کاراکتر بازگشت به خانه است.
\s 
مطابقت دارد با هر فضای خالی، از جمله فاصله‌ها، تب‌ها، شکست صفحات و غیره. معادل "[ \f\n\r\t\v]".
\S 
هر کاراکتر غیرفاصله‌ای را مطابقت می‌دهد. معادل "[^ \f\n\r\t\v]".
\t 
با کاراکتر تب مطابقت دارد.
\v 
با کاراکتر تب عمودی مطابقت دارد.
\w 
مطابقت دارد با هر کاراکتری که یک کلمه را نشان می‌دهد و شامل خط تیره زیرین (_) است. معادل "[A-Za-z0-9_]".
\W 
مطابقت دارد با هر کاراکتری که نمایانگر یک کلمه نباشد. معادل "[^A-Za-z0-9_]".

\num 
مطابق با num است، که در آن num یک عدد صحیح مثبت است. به نگاشت‌های ذخیره‌شده اشاره می‌کند. به عنوان مثال، «(.)\1» با دو کاراکتر متوالی یکسان مطابقت دارد.

\n
مطابقت دارد با n، که در آن n یک مقدار فرار اکتال است. مقادیر فرار اکتال باید شامل ۱، ۲ یا ۳ رقم باشند. به عنوان مثال، «\11» و «\011» هر دو به یک کاراکتر تب (tab) مطابقت دارند. "\0011" معادل "\001" و "1" است. مقادیر فرار اکتال نباید از ۲۵۶ تجاوز کنند. اگر این اتفاق بیفتد، تنها دو رقم اول در عبارت در نظر گرفته می‌شوند. به کدهای ASCII اجازه می‌دهد تا در عبارات باقاعده استفاده شوند.

\xn
مطابق با n است، که در آن n یک مقدار فرار هگزادسیمال است. مقادیر فرار هگزادسیمال باید از دو رقم تشکیل شوند. به عنوان مثال، "\x41" معادل "A" است. "\x041" معادل "\x04" و "1" است. امکان استفاده از کدهای ASCII در عبارت‌های منظم را فراهم می‌کند.

یک عنصر در یک قالب ممکن است یک یا چند بار ظاهر شود. بیایید به چند مثال مربوط به نماد \d که نماینده یک رقم است، نگاهی بیندازیم:

مدل
معنی
\d
یک عدد
\d?
۰ یا ۱ رقم
\d*
۰ یا بیشتر رقم
\d+
۱ یا چند رقم
\d{2}
۲ رقم
\d{3,}
حداقل ۳ رقم
\d{5,7}
بین ۵ تا ۷ رقم

حال بیایید مدلی را در نظر بگیریم که قادر به توصیف فرمت مورد انتظار برای یک رشته باشد:

رشته مقصد
الگو
une date au format jj/mm/aa
\d{2}/\d{2}/\d{2}
une heure au format hh:mm:ss
\d{2}:\d{2}:\d{2}
un nombre entier non signé
\d+
un suite d'espaces éventuellement vide
\s*
un nombre entier non signé qui peut être précédé ou suivi d'espaces
\s*\d+\s*
un nombre entier qui peut être signé et précédé ou suivi d'espaces
\s*[+|-]?\s*\d+\s*
un nombre réel non signé qui peut être précédé ou suivi d'espaces
\s*\d+(.\d*)?\s*
un nombre réel qui peut être signé et précédé ou suivi d'espaces
\s*[+|]?\s*\d+(.\d*)?\s*
une chaîne contenant le mot juste
\bjust\b
  

می‌توانید مشخص کنید که الگو را در کجای رشته جستجو کنید:

الگو
به معنای
^modèle
قالب شروع رشته را مشخص می‌کند
modèle$
قالب رشته را پایان می‌دهد
^modèle$
قالب رشته را شروع و پایان می‌دهد
modèle
الگو در هر نقطه‌ای از رشته، از ابتدا جستجو می‌شود.
مطالعهٔ رشته
الگو
une chaîne se terminant par un point d'exclamation
!$
une chaîne se terminant par un point
\.$
une chaîne commençant par la séquence //
^//
une chaîne ne comportant qu'un mot éventuellement suivi ou précédé d'espaces
^\s*\w+\s*$
une chaîne ne comportant deux mot éventuellement suivis ou précédés d'espaces
^\s*\w+\s*\w+\s*$
une chaîne contenant le mot secret
\bsecret\b

زیرالگوها در یک الگو را می‌توان «استخراج» کرد. این بدان معناست که نه تنها می‌توانیم بررسی کنیم که آیا یک رشته با الگوی خاصی مطابقت دارد، بلکه می‌توانیم عناصر متناظر با زیرالگوهای الگو که در کروشه‌ها قرار گرفته‌اند را از آن رشته استخراج کنیم. برای مثال، اگر در حال تحلیل رشته‌ای هستیم که تاریخ را به فرمت dd/mm/yy دارد و همچنین می‌خواهیم عناصر dd، mm و yy را از آن تاریخ استخراج کنیم، از الگوی (\d\d)/(\d\d)/(\d\d) استفاده خواهیم کرد.

4.9.1. بررسی اینکه آیا یک رشته با یک الگوی داده‌شده مطابقت دارد

یک شیء Regex به صورت زیر ساخته می‌شود:

Public Sub New(ByVal pattern As String)

سازنده یک شیء «بیان منظم» را از الگویی که به‌عنوان پارامتر ارسال شده است ایجاد می‌کند. پس از ساخت الگوی بیان منظم، می‌توان آن را با استفاده از متد IsMatch با رشته‌های کاراکتری مقایسه کرد:

Overloads Public Function IsMatch(ByVal input As String) As Boolean

IsMatch در صورتی که رشته ورودی با الگوی عبارت منظم مطابقت داشته باشد، مقدار true را برمی‌گرداند. در اینجا یک مثال آورده شده است:


' گزینه‌ها
Option Strict On
Option Explicit On 

' فضاهای نام
Imports System
Imports System.Collections
Imports System.Text.RegularExpressions

Module regex1

    Sub Main()
        ' یک الگوی عبارت منظم
        Dim modèle1 As String = "^\s*\d+\s*$"
        Dim regex1 As New Regex(modèle1)
        ' مقایسه یک نمونه با الگو
        Dim exemplaire1 As String = "  123  "
        If regex1.IsMatch(exemplaire1) Then
            affiche(("[" + exemplaire1 + "] correspond au modèle [" + modèle1 + "]"))
        Else
            affiche(("[" + exemplaire1 + "] ne correspond pas au modèle [" + modèle1 + "]"))
        End If
        Dim exemplaire2 As String = "  123a  "
        If regex1.IsMatch(exemplaire2) Then
            affiche(("[" + exemplaire2 + "] correspond au modèle [" + modèle1 + "]"))
        Else
            affiche(("[" + exemplaire2 + "] ne correspond pas au modèle [" + modèle1 + "]"))
        End If
    End Sub

    ' نمایش‌ها 
    Sub affiche(ByVal msg As String)
        Console.Out.WriteLine(msg)
    End Sub
End Module

و نتایج اجرا:

dos>vbc /r:system.dll regex1.vb
Compilateur Microsoft (R) Visual Basic .NET version 7.10.3052.4 pour Microsoft (R) .NET Framework version 1.1.4322.573

dos>regex1
[  123  ] correspond au modèle [^\s*\d+\s*$]
[  123a  ] ne correspond pas au modèle [^\s*\d+\s*$]

4.9.2. تمام عناصری را که با یک الگو مطابقت دارند در یک رشته پیدا کنید

متد Matches

Overloads Public Function Matches(ByVal input As String) As MatchCollection

مجموعه‌ای از عناصر رشته input را که با الگو مطابقت دارند بازمی‌گرداند، همانطور که در مثال زیر نشان داده شده است:


' گزینه‌ها
Option Strict On
Option Explicit On 

' فضاهای نام
Imports System
Imports System.Collections
Imports System.Text.RegularExpressions

Module regex2
    Sub Main()
        ' چندین وقوع الگو در نمونه
        Dim modèle2 As String = "\d+"
        Dim regex2 As New Regex(modèle2)        '
        Dim exemplaire3 As String = "  123  456  789 "
        Dim résultats As MatchCollection = regex2.Matches(exemplaire3)
        affiche(("Modèle=[" + modèle2 + "],exemplaire=[" + exemplaire3 + "]"))
        affiche(("Il y a " & résultats.Count & " occurrences du modèle dans l'exemplaire "))
        Dim i As Integer
        For i = 0 To résultats.Count - 1
            affiche((résultats(i).Value & " en position " & résultats(i).Index))
        Next i
    End Sub

    'نمایش‌ها
    Sub affiche(ByVal msg As String)
        Console.Out.WriteLine(msg)
    End Sub
End Module

کلاس MatchCollection دارای خاصیت Count است که تعداد عناصر مجموعه را نشان می‌دهد. اگر résultats یک نمونه از MatchCollection باشد، آنگاه résultats(i) عنصر i-ام آن مجموعه است و از نوع Match می‌باشد. در مثال ما، résultats مجموعه‌ای از عناصر در رشته exemplaire3 است که با مدل modèle2 مطابقت دارند، و résultats(i) یکی از این عناصر است. کلاس Match دو ویژگی مورد توجه در اینجا دارد:

  • Value: مقدار شیء Match، یعنی عنصری که با الگو مطابقت دارد
  • Index: موقعیتی که عنصر در رشته در حال اسکن در آن یافت شده است

نتایج اجرای برنامه قبلی:

dos>vbc /r:system.dll regex2.vb
Compilateur Microsoft (R) Visual Basic .NET version 7.10.3052.4p our Microsoft (R) .NET Framework version 1.1.4322.573

dos>regex2
Modèle=[\d+],exemplaire=[  123  456  789 ]
Il y a 3 occurrences du modèle dans l'exemplaire
123 en position 2
456 en position 7
789 en position 12

4.9.3. استخراج بخش‌هایی از یک الگو

زیرالگوهای یک الگو را می‌توان «استخراج» کرد. این بدان معناست که نه تنها می‌توانیم بررسی کنیم که آیا یک رشته با الگوی خاصی مطابقت دارد، بلکه می‌توانیم عناصر مربوط به زیرالگوهای الگو که در داخل پرانتز قرار گرفته‌اند را از آن رشته استخراج کنیم. برای مثال، اگر در حال تحلیل رشته‌ای هستید که شامل تاریخی به فرمت dd/mm/yy است و همچنین می‌خواهید عناصر dd، mm و yy را از آن تاریخ استخراج کنید، از الگوی (\d\d)/(\d\d)/(\d\d) استفاده می‌کنید. بیایید به مثال زیر نگاه کنیم:


' گزینه‌ها
Option Strict On
Option Explicit On 

' فضاهای نام
Imports System
Imports System.Collections
Imports System.Text.RegularExpressions

Module regex2
    Sub Main()
        ' عناصر ضبط‌شده در قالب
        Dim modèle3 As String = "(\d\d):(\d\d):(\d\d)"
        Dim regex3 As New Regex(modèle3)
        Dim exemplaire4 As String = "Il est 18:05:49"
        'اعتبارسنجی قالب
        Dim résultat As Match = regex3.Match(exemplaire4)
        If résultat.Success Then
            ' نسخهٔ کپی با الگو مطابقت دارد
            affiche(("L'exemplaire [" + exemplaire4 + "] correspond au modèle [" + modèle3 + "]"))
            'گروه‌ها نمایش داده می‌شوند
            Dim i As Integer
            For i = 0 To résultat.Groups.Count - 1
                affiche(("groupes[" & i & "]=[" & résultat.Groups(i).Value & "] en position " & résultat.Groups(i).Index))
            Next i
        Else
            ' مثال با قالب مطابقت ندارد
            affiche(("L'exemplaire[" + exemplaire4 + " ne correspond pas au modèle [" + modèle3 + "]"))
        End If
    End Sub

    'نمایش می‌دهد
    Sub affiche(ByVal msg As String)
        Console.Out.WriteLine(msg)
    End Sub
End Module

اجرای این برنامه نتایج زیر را تولید می‌کند:

dos>vbc /r:system.dll regex3.vb
Compilateur Microsoft (R) Visual Basic .NET version 7.10.3052.4

dos>regex3
L'exemplaire [Il est 18:05:49] correspond au modèle [(\d\d):(\d\d):(\d\d)]
groupes[0]=[18:05:49] en position 7
groupes[1]=[18] en position 7
groupes[2]=[05] en position 10
groupes[3]=[49] en position 13

تغییر در بخش زیرین کد است:


        ' بررسی قالب
        Dim résultat As Match = regex3.Match(exemplaire4)
        If résultat.Success Then
            ' مثال با قالب مطابقت دارد
            affiche(("L'exemplaire [" + exemplaire4 + "] correspond au modèle [" + modèle3 + "]"))
            'گروه‌ها نمایش داده می‌شوند
            Dim i As Integer
            For i = 0 To résultat.Groups.Count - 1
                affiche(("groupes[" & i & "]=[" & résultat.Groups(i).Value & "] en position " & résultat.Groups(i).Index))
            Next i
        Else

رشته exemplaire4 در مقابل قالب regex3 با استفاده از روش Match مقایسه می‌شود. این یک شیء Match را بازمی‌گرداند که قبلاً توصیف شده است. در اینجا از دو ویژگی جدید این کلاس استفاده می‌کنیم:

  • Success: نشان می‌دهد که آیا تطابق یافت شده است
  • Groups: یک مجموعه که
    • Groups[0] متناظر با بخشی از رشته است که با الگو مطابقت دارد
    • Groups[i] (i>=1) معادل مجموعه i-ام کروشه‌ها است

اگر نتیجه از نوع Match باشد، résultats.Groups از نوع GroupCollection و résultats.Groups[i] از نوع Group است. کلاس Group دارای دو خاصیت است که در اینجا از آن‌ها استفاده می‌کنیم:

  • Value: مقدار شیء گروه متناظر با عنصر در داخل پرانتز
  • Index: موقعیتی که عنصر در رشته در حال تجزیه در آن یافت شده است

4.9.4. یک برنامه آموزشی

یافتن عبارت منظم (regular expression) که به ما امکان می‌دهد بررسی کنیم آیا یک رشته با الگوی خاصی مطابقت دارد یا خیر، گاهی اوقات می‌تواند یک چالش واقعی باشد. برنامه زیر به شما امکان می‌دهد تمرین کنید. این برنامه از شما یک الگو و یک رشته می‌خواهد و سپس نشان می‌دهد که آیا آن رشته با الگو مطابقت دارد یا خیر.


' گزینه‌ها
Option Strict On
Option Explicit On 

' فضاهای نام
Imports System
Imports System.Collections
Imports System.Text.RegularExpressions
Imports Microsoft.visualbasic

Module regex4
    Sub Main()
        ' یک عبارت منظم قالب
        Dim modèle, chaine As String
        Dim regex As Regex = Nothing
        Dim résultats As MatchCollection
        ' از کاربر خواسته می‌شود قالب‌ها و نمونه‌هایی را که باید با این مورد مقایسه شوند، مشخص کند
        Dim terminé1 As Boolean = False
        Do While Not terminé1
            Dim erreur As Boolean = True
            Do While Not terminé1 And erreur
                'قالب درخواست می‌شود
                Console.Out.Write("Tapez le modèle à tester ou fin pour arrêter :")
                modèle = Console.In.ReadLine()
                ' انجام شد؟
                If modèle.Trim().ToLower() = "fin" Then
                    terminé1 = True
                Else
                    'الگوی عبارت منظم ایجاد شد
                    Try
                        regex = New Regex(modèle)
                        erreur = False
                    Catch ex As Exception
                        Console.Error.WriteLine(("Erreur : " + ex.Message))
                    End Try
                End If
            Loop
            ' تمام شد؟
            If terminé1 Then Exit Sub
            'از کاربر خواسته می‌شود نمونه‌هایی را که باید با الگو مقایسه شوند، انتخاب کند
            Dim terminé2 As Boolean = False
            Do While Not terminé2
                Console.Out.Write(("Tapez la chaîne à comparer au modèle [" + modèle + "] ou fin pour arrêter :"))
                chaine = Console.In.ReadLine()
                'انجام شد؟
                If chaine.Trim().ToLower() = "fin" Then
                    terminé2 = True
                Else
                    ' مقایسه را انجام دهید
                    résultats = regex.Matches(chaine)
                    ' موفق بود؟
                    If résultats.Count = 0 Then
                        Console.Out.WriteLine("Je n'ai pas trouvé de correspondances")
                    Else
                        ' عناصر مطابقت‌یافته با الگو نمایش داده می‌شوند
                        Dim i As Integer
                        For i = 0 To résultats.Count - 1
                            Console.Out.WriteLine(("J'ai trouvé la correspondance [" & résultats(i).Value & "] en position " & résultats(i).Index))
                            'زیرعنصرها
                            If résultats(i).Groups.Count <> 1 Then
                                Dim j As Integer
                                For j = 1 To (résultats(i).Groups.Count) - 1
                                    Console.Out.WriteLine((ControlChars.Tab & "sous-élément [" & résultats(i).Groups(j).Value & "] en position " & résultats(i).Groups(j).Index))
                                Next j
                            End If
                        Next i
                    End If
                End If
            Loop
        Loop
    End Sub

    'نمایش می‌دهد
    Sub affiche(ByVal msg As String)
        Console.Out.WriteLine(msg)
    End Sub
End Module

در اینجا مثالی از اجرای برنامه آورده شده است:

Tapez le modèle à tester ou fin pour arrêter :\d+
Tapez la chaîne à comparer au modèle [\d+] ou fin pour arrêter :123 456 789
J'ai trouvé la correspondance [123] en position 0
J'ai trouvé la correspondance [456] en position 4
J'ai trouvé la correspondance [789] en position 8
Tapez la chaîne à comparer au modèle [\d+] ou fin pour arrêter :fin

Tapez le modèle à tester ou fin pour arrêter :(\d\d):(\d\d)
Tapez la chaîne à comparer au modèle [(\d\d):(\d\d)] ou fin pour arrêter :14:15 abcd 17:18 xyzt
J'ai trouvé la correspondance [14:15] en position 0
        sous-élément [14] en position 0
        sous-élément [15] en position 3
J'ai trouvé la correspondance [17:18] en position 11
        sous-élément [17] en position 11
        sous-élément [18] en position 14
Tapez la chaîne à comparer au modèle [(\d\d):(\d\d)] ou fin pour arrêter :fin

Tapez le modèle à tester ou fin pour arrêter :^\s*\d+\s*$
Tapez la chaîne à comparer au modèle [^\s*\d+\s*$] ou fin pour arrêter :  1456
J'ai trouvé la correspondance [  1456] en position 0
Tapez la chaîne à comparer au modèle [^\s*\d+\s*$] ou fin pour arrêter :fin

Tapez le modèle à tester ou fin pour arrêter :^\s*(\d+)\s*$
Tapez la chaîne à comparer au modèle [^\s*(\d+)\s*$] ou fin pour arrêter :1456
J'ai trouvé la correspondance [1456] en position 0
        sous-élément [1456] en position 0
Tapez la chaîne à comparer au modèle [^\s*(\d+)\s*$] ou fin pour arrêter :abcd 1
456
Je n'ai pas trouvé de correspondances
Tapez la chaîne à comparer au modèle [^\s*(\d+)\s*$] ou fin pour arrêter :fin

Tapez le modèle à tester ou fin pour arrêter :fin

4.9.5. متد Split

ما قبلاً این متد را در کلاس String دیده‌ایم:

Overloads Public Function Split(ByVal ParamArray separator() As Char) As String()

این رشته به‌عنوان دنباله‌ای از فیلدها در نظر گرفته می‌شود که با کاراکترهای موجود در آرایه [separator] از هم جدا شده‌اند. نتیجه، آرایه‌ای از این فیلدها است.

جداساز میدان در رشته یکی از کاراکترهای موجود در آرایه separator است. متد Split از کلاس Regex به ما امکان می‌دهد جداکننده را بر اساس یک الگو مشخص کنیم:

Overloads Public Function Split(ByVal input As String) As String()

مجموعه کاراکتری [input] به فیلدها تقسیم می‌شود که توسط جداکننده‌ای که متناسب با قالب شیء فعلی Regex است، از هم جدا شده‌اند. برای مثال فرض کنید که ما در یک فایل متنی خطوطی به شکل field1, field2, …, fieldn داریم. فیلدها با یک ویرگول از هم جدا شده‌اند، اما ممکن است قبل یا بعد از آن فاصله‌ها قرار داشته باشد. بنابراین متد Split از کلاس string مناسب نیست. متد RegEx راه‌حل را ارائه می‌دهد. اگر line خط خوانده‌شده باشد، فیلدها را می‌توان با استفاده از

dim champs() as string=new Regex("s*,\s*").Split(ligne)

همان‌طور که در مثال زیر نشان داده شده است:


' گزینه‌ها
Option Strict On
Option Explicit On 

' فضاهای نام
Imports System
Imports System.Text.RegularExpressions

Module regex5
    Sub Main()
        'یک خط
        Dim ligne As String = "abc  , def  , ghi"
        ' یک قالب
        Dim modèle As New Regex("\s*,\s*")
        ' تفکیک خط به فیلدها
        Dim champs As String() = modèle.Split(ligne)
        ' نمایش
        Dim i As Integer
        For i = 0 To champs.Length - 1
            Console.Out.WriteLine(("champs[" & i & "]=[" & champs(i) & "]"))
        Next i
    End Sub
End Module

نتایج اجرا:

dos>vbc /r:system.dll regex5.vb
Compilateur Microsoft (R) Visual Basic .NET version 7.10.3052.4

dos>regex5
champs[0]=[abc]
champs[1]=[def]
champs[2]=[ghi]

4.10. کلاس‌های BinaryReader و BinaryWriter

کلاس‌های BinaryReader و BinaryWriter برای خواندن و نوشتن فایل‌های باینری استفاده می‌شوند. برنامه‌ی زیر را در نظر بگیرید. ما می‌خواهیم برنامه‌ای بنویسیم که به صورت زیر فراخوانی شود:

// pg متن bin سینتکس
// یک فایل متنی را بخوانید (متن) و محتویات آن را در یک
// فایل باینری
// فایل متنی شامل خطوطی به شکل نام : سن است
//که در ساختاری شامل رشته‌ها و اعداد صحیح ذخیره خواهد شد

فایل متنی حاوی موارد زیر است:

paul : 10
helene : 15
jacques : 11
sylvain : 12

برنامه به شرح زیر است:


' گزینه‌ها
Option Strict On
Option Explicit On 

' فضاهای نام
Imports System
Imports System.Text.RegularExpressions
Imports System.IO

' BinaryWriter()

Module bw1
    ' pg syntax text bin
    ' یک فایل متنی را بخوانید (متن) و محتویات آن را در یک
    ' فایل باینری
    ' فایل متنی شامل خطوطی به شکل نام : سن است
    ' که در یک ساختار شامل یک رشته و یک عدد صحیح ذخیره خواهد شد

    Sub Main(ByVal arguments() As String)
        ' دو آرگومان لازم است
        Dim nbArgs As Integer = arguments.Length
        If nbArgs <> 2 Then
            Console.Error.WriteLine("syntaxe : pg texte binaire")
            Environment.Exit(1)
        End If
        ' باز کردن فایل متنی برای خواندن
        Dim input As StreamReader = Nothing
        Try
            input = New StreamReader(arguments(0))
        Catch ex As Exception
            Console.Error.WriteLine("Erreur d'ouverture du fichier " & arguments(0) & "(" & ex.Message & ")")
            Environment.Exit(2)
        End Try
        ' فایل باینری را برای نوشتن باز کنید
        Dim output As BinaryWriter = Nothing
        Try
            output = New BinaryWriter(New FileStream(arguments(1), FileMode.Create, FileAccess.Write))
        Catch ex As Exception
            Console.Error.WriteLine("Erreur d'ouverture du fichier " & arguments(1) & "(" & ex.Message & ")")
            Environment.Exit(3)
        End Try
        ' خواندن فایل متنی – نوشتن فایل باینری
        ' خط فایل متنی
        Dim ligne As String
        ' جداساز میدان در خط
        Dim séparateur As New Regex("\s*:\s*")
        ' قالب سن
        Dim modAge As New Regex("\s*\d+\s*")
        Dim numLigne As Integer = 0
        Dim traitementFini As Boolean
        Dim champs As String()
        ligne = input.ReadLine()
        While Not (ligne Is Nothing)
            traitementFini = False
            ' خط خالی؟
            If ligne.Trim() = "" Then
                traitementFini = True
            End If
            ' یک خط دیگر
            If Not traitementFini Then
                numLigne += 1
                'یک خط: نام : سن
                champs = séparateur.Split(ligne)
                ' ما به ۲ فیلد نیاز داریم
                If champs.Length <> 2 Then
                    Console.Error.WriteLine(("La ligne n° " & numLigne & " du fichier " & arguments(0) & " a un nombre de champs incorrect"))
                    ' خط بعدی
                    traitementFini = True
                End If
            End If
            If Not traitementFini Then
                ' میدان دوم باید یک عدد صحیح ≥۰ باشد
                If Not modAge.IsMatch(champs(1)) Then
                    Console.Error.WriteLine(("La ligne n° " & numLigne & " du fichier " & arguments(0) & " a un âge incorrect"))
                    ' خط بعدی
                    traitementFini = True
                End If
                ' داده‌ها را در فایل دودویی می‌نویسیم
                output.Write(champs(0))
                output.Write(Integer.Parse(champs(1)))
            End If
            'خط بعدی
            ligne = input.ReadLine()
        End While
        ' بستن فایل‌ها
        input.Close()
        output.Close()
    End Sub
End Module

بیایید بر عملیات مربوط به کلاس BinaryWriter تمرکز کنیم:

  • شیء BinaryWriter توسط عملیات باز می‌شود

            output = New BinaryWriter(New FileStream(arguments(1), FileMode.Create, FileAccess.Write))

آرگومان سازنده باید یک استریم باشد. در اینجا، این استریم از یک فایل (FileStream) ساخته شده است که برای آن فراهم می‌کنیم:

  • (ادامه)
    • نام
    • عملی که باید انجام شود، در این مورد FileMode.Create برای ایجاد فایل
    • نوع دسترسی، در اینجا FileAccess.Write برای دسترسی نوشتاری به فایل
  • عملیات نوشتن

                 ' نوشتن داده‌ها به فایل دودویی
                output.Write(champs(0))
                output.Write(Integer.Parse(champs(1)))

کلاس BinaryWriter دارای متدهای مختلفی است که بازنویسی شده‌اند (Write) برای نوشتن انواع مختلف داده‌های ساده

  • عملیات بستن استریم
        output.Close()

نتایج اجرای قبلی توسط برنامهٔ زیر ارائه خواهد شد. این برنامه همچنین دو آرگومان را می‌پذیرد:

     ' pg bin text syntax
     'یک فایل باینری 'bin' را می‌خواند و محتویات آن را در یک فایل متنی ('text') ذخیره می‌کند
     ' فایل باینری دارای ساختاری متشکل از رشته‌ها و اعداد صحیح است
     ' فایل متنی شامل خطوطی به شکل نام : سن است

بنابراین عملیات معکوس را انجام می‌دهیم. یک فایل باینری را می‌خوانیم تا یک فایل متنی ایجاد کنیم. اگر فایل متنی حاصل با فایل اصلی یکسان باشد، خواهیم دانست که تبدیل متن ← باینری ← متن با موفقیت انجام شده است. کد به شرح زیر است:


' گزینه‌ها
Option Strict On
Option Explicit On 

' فضاهای نام
Imports System
Imports System.Text.RegularExpressions
Imports System.IO

Module br1
    ' pg bin text syntax
    ' یک فایل باینری «bin» را بخوانید و محتویات آن را در یک فایل متنی («text») ذخیره کنید
    ' فایل باینری دارای ساختاری متشکل از رشته‌ها و اعداد صحیح است
    ' فایل متنی شامل خطوطی به شکل نام : سن است

    Sub Main(ByVal arguments() As String)
        ' دو آرگومان لازم است
        Dim nbArgs As Integer = arguments.Length
        If nbArgs <> 2 Then
            Console.Error.WriteLine("syntaxe : pg binaire texte")
            Environment.Exit(1)
        End If
        ' فایل باینری را برای خواندن باز کنید
        Dim dataIn As BinaryReader = Nothing
        Try
            dataIn = New BinaryReader(New FileStream(arguments(0), FileMode.Open, FileAccess.Read))
        Catch ex As Exception
            Console.Error.WriteLine("Erreur d'ouverture du fichier " & arguments(0) & "(" & ex.Message & ")")
            Environment.Exit(2)
        End Try
        ' باز کردن فایل متنی برای نوشتن
        Dim dataOut As StreamWriter = Nothing
        Try
            dataOut = New StreamWriter(arguments(1))
            dataOut.AutoFlush = True
        Catch ex As Exception
            Console.Error.WriteLine("Erreur d'ouverture du fichier " & arguments(1) & "(" & ex.Message & ")")
            Environment.Exit(3)
        End Try
        ' خواندن فایل باینری – نوشتن فایل متنی
        Dim nom As String        ' nom d'une personne
        Dim age As Integer        ' son âge
        'حلقه برای پردازش فایل باینری
        While True
            ' خواندن نام
            Try
                nom = dataIn.ReadString()
            Catch
                ' پایان فایل
                Exit Sub
            End Try
            ' خواندن سن
            Try
                age = dataIn.ReadInt32()
            Catch
                Console.Error.WriteLine("Le fichier " & arguments(0) + " ne semble pas avoir un format correct")
                Exit Sub
            End Try
            ' نوشتن در فایل متنی
            dataOut.WriteLine(nom & ":" & age)
            System.Console.WriteLine(nom & ":" & age)
        End While
        ' بستن همه چیز
        dataIn.Close()
        dataOut.Close()
    End Sub
End Module

بیایید نگاهی دقیق‌تر به عملیات مربوط به کلاس BinaryReader بیندازیم:

  • شیء BinaryReader توسط عملیات باز می‌شود

            dataIn = New BinaryReader(New FileStream(arguments(0), FileMode.Open, FileAccess.Read))

آرگومان سازنده باید یک استریم باشد. در اینجا، این یک استریم ساخته‌شده از یک فایل (FileStream) است که برای آن فراهم می‌کنیم:

  • (ادامه)
    • نام
    • عملی که باید انجام شود، در این مورد FileMode.Open برای باز کردن یک فایل موجود
    • نوع دسترسی، در اینجا FileAccess.Read برای دسترسی خواندنی به فایل
  • عملیات خواندن
                nom = dataIn.ReadString()
                age = dataIn.ReadInt32()

کلاس BinaryReader دارای متدهای مختلفی مانند ReadXX برای خواندن انواع مختلف داده‌های ساده است

  • عملیات بستن استریم
        dataIn.Close()

اگر این دو برنامه را پشت سر هم اجرا کنیم، یعنی personnes.txt را به personnes.bin و سپس personnes.bin را به personnes.txt2 تبدیل کنیم، نتیجه به این صورت خواهد بود:

dos>more personnes.txt
paul : 10
helene : 15
jacques : 11
sylvain : 12

dos>more personnes.txt2
paul:10
helene:15
jacques:11
sylvain:12

dos>dir
29/04/2002  18:19                   54 personnes.txt
29/04/2002  18:19                   44 personnes.bin
29/04/2002  18:20                   44 personnes.txt2