Skip to content

2. مبانی زبان VB.NET

2.1. مقدمه

ابتدا VB.NET را به‌عنوان یک زبان برنامه‌نویسی متعارف در نظر می‌گیریم. بعداً به اشیاء خواهیم پرداخت.

در یک برنامه، دو نوع چیز وجود دارد

  • داده‌ها
  • دستورالعمل‌هایی که آن را دستکاری می‌کنند

ما معمولاً سعی می‌کنیم داده‌ها را از دستورالعمل‌ها جدا کنیم:

2.2. داده‌ها در VB.NET

VB.NET از انواع داده زیر استفاده می‌کند:

  1. اعداد صحیح، اعداد حقیقی و اعشاری
  1. نوارها و رشته‌های متنی
  2. بول‌ها
  3. تاریخ‌ها
  4. ابجکت‌ها

2.2.1. انواع داده از پیش تعریف‌شده

نوع VB
نوع معادل .NET
اندازه
محدوده مقادیر
منطقی
System.Boolean
۲ بایت
درست یا نادرست.
بایت
System.Byte
۱ بایت
۰ تا ۲۵۵ (بدون علامت).
کاراکتر
System.Char
۲ بایت
0 تا 65,535 (بدون علامت).
تاریخ
System.DateTime
۸ بایت
0:00:00 در 1 ژانویه 0001 تا 23:59:59 در 31 دسامبر 9999.
ممیز
System.Decimal
۱۶ بایت
از 0 تا +/-79,228,162,514,264,337,593,543,950,335 بدون اعشار؛ از 0 تا +/-7.9228162514264337593543950335 با 28 رقم اعشار؛ کوچک‌ترین عدد غیرصفر، عدد +/-0.0000000000000000000000000001 (+/-1E-28) است.
دوگانه
System.Double
۸ بایت
-1,79769313486231E+308 تا
برای مقادیر منفی -4,94065645841247E-324؛ و برای مقادیر مثبت از 4,94065645841247E-324 تا 1,79769313486231E+308.
پوئنتر
System.Int32
۴ بایت
از -۲٬۱۴۷٬۴۸۳٬۶۴۸ تا ۲٬۱۴۷٬۴۸۳٬۶۴۷.
Long
System.Int64
۸ بایت
از -۹٬۲۲۳٬۳۷۲٬۰۳۶٬۸۵۴٬۷۷۵٬۸۰۸ تا ۹٬۲۲۳٬۳۷۲٬۰۳۶٬۸۵۴٬۷۷۵٬۸۰۷.
شیء
System.Object
۴ بایت
هر نوع را می‌توان در یک متغیر از نوع Object ذخیره کرد.
کوتاه
System.Int16
۲ بایت
-۳۲٬۷۶۸ تا ۳۲٬۷۶۷.
تک‌کاره
System.Single
۴ بایت
-3,402823E+38 تا -1,401298E-45 برای مقادیر منفی؛ 1,401298E-45 تا 3,402823E+38 برای مقادیر مثبت.
رشته
System.String (کلاس)
 
0 تا تقریباً 2 میلیارد کاراکتر یونیکد.

در جدول بالا می‌بینیم که دو نوع ممکن برای یک عدد صحیح ۳۲ بیتی وجود دارد: Integer و System.Int32. این دو نوع قابل تعویض هستند. همین امر در مورد انواع دیگر، یعنی VB و معادل‌های آن‌ها در پلتفرم .NET نیز صدق می‌کند. در اینجا یک برنامه نمونه آورده شده است:


Module types
    Sub Main()
        ' اعداد صحیح
        Dim var1 As Integer = 100
        Dim var2 As Long = 10000000000L
        Dim var3 As Byte = 100
        Dim var4 As Short = 4
        ' اعداد حقیقی
        Dim var5 As Decimal = 4.56789D
        Dim var6 As Double = 3.4
        Dim var7 As Single = -0.000103F
        ' تاریخ
        Dim var8 As Date = New Date(2003, 1, 1, 12, 8, 4)
        ' بولین
        Dim var9 As Boolean = True
        ' نقطهٔ کد
        Dim var10 As Char = "A"c
        ' رشتهٔ کاراکتری
        Dim var11 As String = "abcde"
        ' شیء
        Dim var12 As Object = New Object
        ' نمایش‌ها
        Console.Out.WriteLine("var1=" + var1.ToString)
        Console.Out.WriteLine("var2=" + var2.ToString)
        Console.Out.WriteLine("var3=" + var3.ToString)
        Console.Out.WriteLine("var4=" + var4.ToString)
        Console.Out.WriteLine("var5=" + var5.ToString)
        Console.Out.WriteLine("var6=" + var6.ToString)
        Console.Out.WriteLine("var7=" + var7.ToString)
        Console.Out.WriteLine("var8=" + var8.ToString)
        Console.Out.WriteLine("var9=" + var9.ToString)
        Console.Out.WriteLine("var10=" + var10)
        Console.Out.WriteLine("var11=" + var11)
        Console.Out.WriteLine("var12=" + var12.ToString)
    End Sub
End Module

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

var1=100
var2=10000000000
var3=100
var4=4
var5=4,56789
var6=3,4
var7=-0,000103
var8=01/01/2003 12:08:04
var9=True
var10=A
var11=abcde
var12=System.Object

2.2.2. نشانه‌گذاری برای داده‌های صریح

Integer
145, -7, &FF (هگزادسیمال)
Long
100000L
Double
۱۳۴٫۷۸۹، ۴۵×۱۰⁻¹⁸ (−۴۵ × ۱۰⁻¹⁸)
Single
134.789F, -45E-18F (-45 × 10⁻¹⁸)
Decimal
100000D
Char
"A"c
String
"امروز"
Boolean
true, false
date
تاریخ جدید (۲۰۰۳، ۱، ۱) برای ۰۱/۰۱/۲۰۰۳

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

  • 100000L، که در آن 'L' نشان می‌دهد عدد به‌عنوان یک عدد صحیح بلند در نظر گرفته می‌شود
  • 134.789F، که در آن 'F' نشان می‌دهد عدد به‌عنوان یک عدد حقیقی با دقت تک‌دقیقه در نظر گرفته می‌شود
  • 100000D، که در آن 'D' نشان می‌دهد عدد به‌عنوان یک عدد حقیقی اعشاری در نظر گرفته می‌شود
  • "A"c، برای تبدیل رشتهٔ کاراکتری "A" به کاراکتر 'A'
  • رشته در داخل کاراکتر " محصور شده است. اگر رشته قرار باشد شامل کاراکتر " باشد، این کاراکتر دو برابر می‌شود، مانند "abcd""e"، برای نمایش رشته [abcd"e].

2.2.3. اعلام داده

2.2.3.1. نقش اعلان‌ها

یک برنامه داده‌هایی را که با یک نام و یک نوع مشخص می‌شوند، پردازش می‌کند. این داده‌ها در حافظه ذخیره می‌شوند. هنگامی که برنامه کامپایل می‌شود، کامپایلر برای هر بخش از داده‌ها یک مکان حافظه را که با یک آدرس و یک اندازه مشخص می‌شود، اختصاص می‌دهد. این کار را با استفاده از اعلان‌هایی که توسط برنامه‌نویس انجام شده است، انجام می‌دهد. علاوه بر این، این اعلان‌ها به کامپایلر امکان می‌دهند تا خطاهای برنامه‌نویسی را تشخیص دهد. برای مثال، اگر x یک رشتهٔ کاراکتری باشد، عملیات x = x \* 2 به عنوان خطا علامت‌گذاری خواهد شد.

2.2.3.2. اعلام ثابت‌ها

سینتکس اعلام یک ثابت به شرح زیر است:

const identifier as type=value

برای مثال، [const PI as double=3.141592]. چرا ثابت‌ها را اعلام کنیم؟

  1. خوانایی برنامه با دادن نام معنادار به ثابت آسان‌تر می‌شود: [const taux_tva as single=0.186F]
  2. در صورتی که نیاز به تغییر «ثابت» باشد، اصلاح برنامه آسان‌تر خواهد بود. بنابراین، در مثال قبلی، اگر نرخ مالیات بر ارزش افزوده به ۳۳ درصد افزایش یابد، تنها تغییری که لازم است اعمال شود، اصلاح عبارت تعریف‌کننده مقدار آن خواهد بود: [const taux_tva as single=0.336F]. اگر عدد 0.186 به‌طور صریح در برنامه استفاده شده بود، در آن صورت لازم بود که شمار زیادی از دستورات اصلاح شوند.

2.2.3.3. اعلام متغیر

یک متغیر با یک نام شناسایی می‌شود و با یک نوع داده مرتبط است. VB.NET نسبت به حروف بزرگ و کوچک حساس نیست. بنابراین، متغیرهای FIN و fin یکسان هستند. متغیرها می‌توانند هنگام تعریف مقدار اولیه دریافت کنند. نحو تعریف یک یا چند متغیر به صورت زیر است:

dim variable1, variable2, ..., variablen as type_identifier

که در آن identificateur_de_type می‌تواند یک نوع از پیش تعریف‌شده یا نوعی باشد که توسط برنامه‌نویس تعریف شده است.

2.2.4. تبدیل بین اعداد و رشته‌های کاراکتری

nombre -> chaîne
nombre.ToString یا "" & number یا CType(number, String)
objet -> chaîne
objet.ToString
chaine -> Integer
Integer.Parse(string) یا Int32.Parse
chaîne -> Long
Long.Parse (string) or Int64.Parse
chaîne -> Double
Double.Parse (string)
chaîne -> Single
Single.Parse(string)

تبدیل یک رشته به عدد ممکن است ناموفق باشد اگر رشته نمایانگر عدد معتبری نباشد. سپس یک خطای مرگبار، معروف به استثنا، تولید می‌شود: VB.NET. این خطا را می‌توان با عبارت زیر try/catch مدیریت کرد:

try
        appel de la fonction susceptible de générer l'exception
 catch e as Exception
        traiter l'exception e
end try
instruction suivante

اگر تابع خطا (exception) پرتاب نکند، برنامه به دستور بعدی می‌رود؛ در غیر این صورت، وارد بدنه عبارت catch شده و سپس به دستور بعدی می‌رود. بعداً به موضوع مدیریت استثنا باز خواهیم گشت. در اینجا برنامه‌ای آورده شده است که تکنیک‌های اصلی تبدیل بین اعداد و رشته‌های متنی را نشان می‌دهد. در این مثال، تابع مقدار پارامتر خود را روی صفحه نمایش می‌دهد. بنابراین، affiche(S) مقدار S را روی صفحه نمایش می‌دهد.


' دستورالعمل‌ها
Option Strict On

' فضاهای نام واردشده
Imports System

' ماژول تست
Module Module1

    Sub Main()
        ' روند اصلی
        ' داده‌های محلی
        Dim S As String
        Const i As Integer = 10
        Const l As Long = 100000
        Const f As Single = 45.78F
        Dim d As Double = -14.98

        ' عدد --> رشته
        affiche(CType(i, String))
        affiche(CType(l, String))
        affiche(CType(f, String))
        affiche(CType(d, String))

        'بولی --> رشته
        Const b As Boolean = False
        affiche(b.ToString)

        ' رشته --> عدد صحیح
        Dim i1 As Integer = Integer.Parse("10")
        affiche(i1.ToString)
        Try
            i1 = Integer.Parse("10.67")
            affiche(i1.ToString)
        Catch e As Exception
            affiche("Erreur [10.67] : " + e.Message)
        End Try

        ' string --> long
        Dim l1 As Long = Long.Parse("100")
        affiche("" + l1.ToString)
        Try
            l1 = Long.Parse("10.675")
            affiche("" & l1)
        Catch e As Exception
            affiche("Erreur [10.675] : " + e.Message)
        End Try

        ' string --> double
        Dim d1 As Double = Double.Parse("100,87")
        affiche(d1.ToString)
        Try
            d1 = Double.Parse("abcd")
            affiche("" & d1)
        Catch e As Exception
            affiche("Erreur [abcd] : " + e.Message)
        End Try

        ' string --> single
        Dim f1 As Single = Single.Parse("100,87")
        affiche(f1.ToString)
        Try
            d1 = Single.Parse("abcd")
            affiche(f1.ToString)
        Catch e As Exception
            affiche("Erreur [abcd] : " + e.Message)
        End Try
    End Sub

    'نمایش‌ها
    Public Sub affiche(ByVal S As String)
        Console.Out.WriteLine("S=" + S)
    End Sub
End Module

نتایج به‌دست‌آمده به شرح زیر است:

S=10
S=100000
S=45,78
S=-14,98
S=False
S=10
S=Erreur [10.67] : Le format de la chaîne d'entrée est incorrect.
S=100
S=Erreur [10.675] : Le format de la chaîne d'entrée est incorrect.
S=100,87
S=Erreur [abcd] : Le format de la chaîne d'entrée est incorrect.
S=100,87
S=Erreur [abcd] : Le format de la chaîne d'entrée est incorrect.

توجه داشته باشید که اعداد حقیقی نمایش‌داده‌شده به‌صورت رشته‌ها باید به‌جای نقطه از ویرگول استفاده کنند. بنابراین، شما می‌نویسید Dim d As Double = -14.98 اما Dim d1 As Double = Double.Parse("100.87")

2.2.5. آرایه‌های داده

یک آرایه VB.NET یک شیء است که امکان گروه‌بندی داده‌های یکسان تحت یک شناسه واحد را فراهم می‌کند. این آرایه به صورت زیر تعریف می‌شود:

Dim Array(n) as type یا Dim Array() as type = New type(n) {}

که در آن n نمایه آخرین عنصر آرایه است. سینتکس Tableau(i) به آیتم داده i اشاره دارد، که در آن i به محدوده [0,n] تعلق دارد. هرگونه ارجاع به آیتم داده Tableau(i) که در آن i به محدوده [0,n] تعلق نداشته باشد، باعث ایجاد یک استثنا (exception) خواهد شد. یک آرایه را می‌توان همزمان با تعریف آن، مقداردهی اولیه کرد. در این مورد، نیازی به مشخص کردن شاخص عنصر آخر نیست.


        Dim entiers() As Integer = {0, 10, 20, 30}

آرایه‌ها دارای خاصیت **Length** هستند که تعداد عناصر آرایه را نشان می‌دهد. در اینجا یک برنامه نمونه آورده شده است:


Module tab0
    Sub Main()
        ' یک آرایهٔ اول
        Dim tab0(5) As Integer
        For i As Integer = 0 To UBound(tab0)
            tab0(i) = i
        Next
        For i As Integer = 0 To UBound(tab0)
            Console.Out.WriteLine("tab0(" + i.ToString + ")=" + tab0(i).tostring)
        Next

        ' جدول دوم
        Dim tab1() As Integer = New Integer(5) {}
        For i As Integer = 0 To tab1.Length - 1
            tab1(i) = i * 10
        Next
        For i As Integer = 0 To tab1.Length - 1
            Console.Out.WriteLine("tab1(" + i.ToString + ")=" + tab1(i).tostring)
        Next
    End Sub
End Module

و خروجی آن:

tab0(0)=0
tab0(1)=1
tab0(2)=2
tab0(3)=3
tab0(4)=4
tab0(5)=5
tab1(0)=0
tab1(1)=10
tab1(2)=20
tab1(3)=30
tab1(4)=40
tab1(5)=50

یک آرایه دو بعدی را می‌توان به صورت زیر اعلام کرد:

Dim Array(n,m) as Type یا Dim Array(,) as Type = New Type(n,m) {}

که در آن n+1 تعداد سطرها و m+1 تعداد ستون‌ها است. عبارت Array(i,j) به عنصر j در سطر i از آرایه اشاره دارد. آرایه دوبعدی همچنین می‌تواند همزمان با تعریف شدن مقداردهی اولیه شود:


        Dim réels(,) As Double = {{0.5, 1.7}, {8.4, -6}}

تعداد عناصر در هر بعد را می‌توان با استفاده از متد GetLenth(i) به دست آورد، که در آن i=0 نمایانگر بعد مربوط به اولین شاخص، i=1 نمایانگر بعد مربوط به دومین شاخص و ... است. در اینجا یک برنامه نمونه آورده شده است:


Module Module2
    Sub Main()
        ' یک جدول اول
        Dim tab0(2, 1) As Integer
        For i As Integer = 0 To UBound(tab0)
            For j As Integer = 0 To tab0.GetLength(1) - 1
                tab0(i, j) = i * 10 + j
            Next
        Next
        For i As Integer = 0 To UBound(tab0)
            For j As Integer = 0 To tab0.GetLength(1) - 1
                Console.Out.WriteLine("tab0(" + i.ToString + "," + j.ToString + ")=" + tab0(i, j).tostring)
            Next
        Next

        ' جدول دوم
        Dim tab1(,) As Integer = New Integer(2, 1) {}
        For i As Integer = 0 To tab1.GetLength(0) - 1
            For j As Integer = 0 To tab1.GetLength(1) - 1
                tab1(i, j) = i * 100 + j
            Next
        Next
        For i As Integer = 0 To tab1.GetLength(0) - 1
            For j As Integer = 0 To tab1.GetLength(1) - 1
                Console.Out.WriteLine("tab1(" + i.ToString + "," + j.ToString + ")=" + tab1(i, j).tostring)
            Next
        Next
    End Sub
End Module

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

tab0(0)=0
tab0(1)=1
tab0(2)=2
tab0(3)=3
tab0(4)=4
tab0(5)=5
tab1(0)=0
tab1(1)=10
tab1(2)=20
tab1(3)=30
tab1(4)=40
tab1(5)=50

یک آرایه از آرایه‌ها به صورت زیر تعریف می‌شود:

Dim Array(n)() As Type یا Dim Array()() As Type = New Type(n)()

اعلامیه‌ی بالا آرایه‌ای با n+1 سطر ایجاد می‌کند. هر عنصر Array(i) یک مرجع آرایه‌ی یک‌بعدی است. این آرایه‌ها در زمان اعلام بالا ایجاد نمی‌شوند. مثال زیر نحوه‌ی ایجاد یک آرایه‌ی آرایه‌ها را نشان می‌دهد:


         ' یک آرایه از آرایه‌ها
        Dim noms()() As String = New String(3)() {}
         ' ابتدایی‌سازی
        For i = 0 To noms.Length - 1
            noms(i) = New String(i) {}
            For j = 0 To noms(i).Length - 1
                noms(i)(j) = "nom" & i & j
            Next
        Next

در اینجا، noms(i) آرایه‌ای با i+1 عنصر است. از آنجایی که noms(i) یک آرایه است، noms(i).Length تعداد عناصر آن است. در اینجا مثالی آورده شده است که سه نوع آرایه‌ای را که به تازگی معرفی کرده‌ایم ترکیب می‌کند:


' دستورالعمل‌ها
Option Strict On
Option Explicit On 

' واردات‌ها
Imports System

'کلاس تست
Module test
    Sub main()
        'یک آرایه یک‌بعدی مقداردهی‌شده
        Dim entiers() As Integer = {0, 10, 20, 30}
        Dim i As Integer
        For i = 0 To entiers.Length - 1
            Console.Out.WriteLine("entiers[" & i & "]=" & entiers(i))
        Next

        'یک آرایهٔ دو‌بعدی مقداردهی‌شده
        Dim réels(,) As Double = {{0.5, 1.7}, {8.4, -6}}
        Dim j As Integer
        For i = 0 To réels.GetLength(0) - 1
            For j = 0 To réels.GetLength(1) - 1
                Console.Out.WriteLine("réels[" & i & "," & j & "]=" & réels(i, j))
            Next
        Next

        ' یک آرایه از آرایه‌ها
        Dim noms()() As String = New String(3)() {}

        ' ابتدایی‌سازی
        For i = 0 To noms.Length°- 1
            noms(i) =°New String(i) {}
            For j = 0 To noms(i).Length - 1
                noms(i)(j) = "nom" & i & j
            Next
        Next

        ' نمایش
        For i = 0 To noms.Length°- 1
            For j = 0 To noms(i).Length - 1
                Console.Out.WriteLine("noms[" & i & "][" & j & "]=" & noms(i)(j))
            Next
        Next
    End Sub
End Module

هنگام اجرا، نتایج زیر را به دست می‌آوریم:

entiers[0]=0
entiers[1]=10
entiers[2]=20
entiers[3]=30
réels[0,0]=0,5
réels[0,1]=1,7
réels[1,0]=8,4
réels[1,1]=-6
noms[0][0]=nom00
noms[1][0]=nom10
noms[1][1]=nom11
noms[2][0]=nom20
noms[2][1]=nom21
noms[2][2]=nom22
noms[3][0]=nom30
noms[3][1]=nom31
noms[3][2]=nom32
noms[3][3]=nom33

2.3. دستورالعمل‌های پایه برای VB.NET

تفاوتی قائل شده‌اند بین

۱ دستورالعمل‌های پایه‌ای که توسط رایانه اجرا می‌شوند.

2 دستورالعمل‌هایی که جریان برنامه را کنترل می‌کنند.

دستورات پایه زمانی روشن می‌شوند که ساختار یک ریزرایانه و اجزای جانبی آن را در نظر بگیریم.

  1. خواندن اطلاعات از صفحه‌کلید

  2. پردازش اطلاعات

  3. نوشتن اطلاعات روی صفحه نمایش

  4. خواندن اطلاعات از یک فایل دیسکی

  5. نوشتن اطلاعات در یک فایل دیسکی

2.3.1. نوشتن روی صفحه

دستورالعمل‌های مختلفی برای نوشتن روی صفحه وجود دارد:

Console.Out.WriteLine(expression)
Console.WriteLine(expression)
Console.Error.WriteLine (expression)

که در آن expression هر نوع داده‌ای است که می‌تواند به یک رشته کاراکتری برای نمایش روی صفحه تبدیل شود. در مثال‌های دیده‌شده تا به حال، ما فقط از دستور Console.Out.WriteLine(expression). استفاده کرده‌ایم.

کلاس System.Console دسترسی به عملیات نوشتن روی صفحه (Write، WriteLine) را فراهم می‌کند. کلاس Console دارای دو ویژگی Out و Error است که جریان‌های نوشتاری از نوع StreamWriter هستند:

  • Console.WriteLine() معادل Console.Out.WriteLine() است و به جریان Out می‌نویسد که معمولاً با صفحه مرتبط است.
  • Console.Error.WriteLine() در جریان خطا (Error stream) می‌نویسد، که آن نیز معمولاً با صفحه نمایش مرتبط است.

جریان‌های Out و Error به‌طور پیش‌فرض با صفحه مرتبط هستند. با این حال، می‌توان آن‌ها را در زمان اجرا به فایل‌های متنی هدایت کرد، همان‌طور که به‌زودی خواهیم دید.

2.3.2. خواندن داده‌های واردشده از طریق صفحه‌کلید

جریان داده از صفحه‌کلید توسط شیء Console.In از نوع StreamReader نمایش داده می‌شود. این نوع شیء امکان خواندن یک خط متن را با استفاده از متد ReadLine فراهم می‌کند:


        Dim ligne As String = Console.In.ReadLine()

خطی که روی صفحه‌کلید تایپ می‌شود در متغیر ligne ذخیره می‌شود و سپس می‌تواند توسط programme.Le پردازش شود. جریان ورودی می‌تواند درست مانند جریان‌های خروجی و خطا به یک فایل هدایت شود.

2.3.3. نمونه‌ای از ورودی/خروجی

در اینجا یک برنامه کوتاه برای نمایش عملیات ورودی/خروجی صفحه‌کلید/صفحه نمایش آورده شده است:


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

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

' ماژول
Module io1
    Sub Main()
        ' نوشتن به خروجی
        Dim obj As New Object
        Console.Out.WriteLine(("" & obj.ToString))

        ' نوشتن در جریان خطا
        Dim i As Integer = 10
        Console.Error.WriteLine(("i=" & i))

        ' خواندن یک خط وارد شده از طریق صفحه‌کلید
        Console.Out.Write("Tapez une ligne : ")
        Dim ligne As String = Console.In.ReadLine()
        Console.Out.WriteLine(("ligne=" + ligne))
    End Sub
End Module

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

System.Object
i=10
Tapez une ligne : ceci est un essai
ligne=ceci est un essai

دستورالعمل‌ها


        Dim obj As New Object
        Console.Out.WriteLine(obj.ToString)

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

2.3.4. انحراف ورودی/خروجی

در DOS/Windows، سه دستگاه استاندارد وجود دارد که به نام‌های زیر شناخته می‌شوند:

  1. دستگاه ورودی استاندارد – به‌طور پیش‌فرض به صفحه‌کلید اشاره دارد و شمارهٔ آن 0 است
  2. دستگاه خروجی استاندارد – به‌طور پیش‌فرض به صفحه نمایش اشاره دارد و شمارهٔ آن ۱ است
  3. دستگاه خطای استاندارد – به‌طور پیش‌فرض به صفحه نمایش اشاره دارد و شمارهٔ ۲ را دارد.

در VB.NET، جریان خروجی Console.Out به دستگاه 1، جریان خروجی Console.Error به دستگاه 2 و جریان ورودی Console.In از دستگاه 0 داده می‌خواند. هنگام اجرای یک برنامه در پنجرهٔ DOS زیر ویندوز، می‌توانید مشخص کنید که کدام دستگاه‌ها برای برنامهٔ در حال اجرا برابر 0، 1 و 2 باشند. خط فرمان زیر را در نظر بگیرید:

pg arg1 arg2 .. argn

با استفاده از آرگومان‌های argi برنامه pg، دستگاه‌های ورودی/خروجی استاندارد را می‌توان به فایل‌ها هدایت کرد:

0<in.txt
جریان ورودی استاندارد شماره ۰ به فایل in.txt هدایت می‌شود. بنابراین در برنامه، جریان Console.In داده‌های خود را از فایل in.txt خواهد گرفت.
 
1>out.txt
خروجی شماره ۱ را به فایل out.txt هدایت می‌کند. در نتیجه، در داخل برنامه، جریان Console.Out داده‌های خود را به فایل out.txt خواهد نوشت.
  
1>>out.txt
همین امر صدق می‌کند، اما داده‌های نوشته شده به محتویات فعلی فایل out.txt ضمیمه می‌شوند.
  
2>error.txt
خروجی شماره ۲ را به فایل error.txt هدایت می‌کند. این بدان معناست که، در داخل برنامه، جریان Console.Error داده‌های خود را به فایل error.txt خواهد نوشت.
  
2>>error.txt
همین امر صدق می‌کند، اما داده‌های نوشته شده به محتویات فعلی فایل error.txt ضمیمه می‌شوند.
  
1>out.txt 2>error.txt
دستگاه‌های ۱ و ۲ هر دو به فایل‌ها هدایت شده‌اند
  

توجه کنید که برای هدایت جریان‌های ورودی/خروجی از برنامه pg به فایل‌ها، نیازی به تغییر برنامه pg نیست. این برنامه OS است که ماهیت دستگاه‌های 0، 1 و 2 را تعیین می‌کند. برنامه زیر را در نظر بگیرید:


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

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

' انحراف مسیر
Module console2
    Sub Main()
        ' خواندن از جریان ورودی
        Dim data As String = Console.In.ReadLine()
        'نوشتن در خروجی
        Console.Out.WriteLine(("écriture dans flux Out : " + data))
        ' نوشتن در جریان خطا
        Console.Error.WriteLine(("écriture dans flux Error : " + data))
    End Sub
End Module

بیایید این برنامه را کامپایل کنیم:

dos>vbc es2.vb
Compilateur Microsoft (R) Visual Basic .NET version 7.10.3052.4 pour Microsoft (R) .NET Framework version 1.1.4322.573
Copyright (C) Microsoft Corporation 1987-2002. Tous droits réservés.

dos>dir
24/02/2004  15:39                  416 es2.vb
11/03/2004  08:20                3 584 es2.exe

بیایید آن را برای اولین بار اجرا کنیم:

dos>es2.exe
un premier test
écriture dans flux Out : un premier test
écriture dans flux Error : un premier test

اجرای قبلی هیچ‌کدام از جریان‌های استاندارد ورودی (In)، خروجی (Out) یا خطا (Error) را مسیردهی نمی‌کند. اکنون هر سه جریان را مسیردهی خواهیم کرد. جریان In به فایلی به نام in.txt مسیردهی خواهد شد، جریان Out به فایل out.txt، و جریان Error به فایل error.txt. این هدایت در خط فرمان به صورت زیر انجام می‌شود

dos>es2.exe 0<in.txt 1>out.txt 2>error.txt

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

dos>more in.txt
un second test

dos>es2.exe 0<in.txt 1>out.txt 2>error.txt

dos>more out.txt
écriture dans flux Out : un second test

dos>more error.txt
écriture dans flux Error : un second test

واضح است که جریان‌های Out و Error به دستگاه‌های یکسان نمی‌نویسند.

2.3.5. مقادیر یک عبارت را به یک متغیر اختصاص دادن

ما در اینجا به عملیات variable=expression. می‌پردازیم. عبارت می‌تواند از انواع زیر باشد: عددی، رابطه‌ای، بولی، رشته‌ای.

2.3.5.1. فهرست عملگرها

عمل
عنصر زبان
Arithmétique
^, –, *, /, \, Mod, +, =
Assignation
=, ^=, *=, /=, \=, +=, -=, &=
Comparaison
=, <>, <, >, <=, >=, Like, Is
Concaténation
و، +
Opérations logiques/de bits
نه، و، یا، ایکس‌اور، AndAlso، OrElse
Opérations diverses
AddressOf, GetType

2.3.5.2. بیان جبری

عملگرهای مورد استفاده در عبارت‌های عددی به شرح زیر هستند:

Arithmétique
^, –, *, /, \, Mod, +, =

+: جمع، -: تفریق، *: ضرب، /: تقسیم ممیز شناور، \,: تقسیم صحیح (باقیمانده)، Mod: باقی‌مانده تقسیم صحیح، ^: توان‌دهی. بنابراین، برنامه زیر:


' عملگرهای عددی
Module operateursarithmetiques
    Sub Main()
        Dim i, j As Integer
        i = 4 : j = 3
        Console.Out.WriteLine(i & "/" & j & "=" & (i / j))
        Console.Out.WriteLine(i & "\" & j & "=" & (i \ j))
        Console.Out.WriteLine(i & " mod " & j & "=" & (i Mod j))

        Dim r1, r2 As Double
        r1 = 4.1 : r2 = 3.6
        Console.Out.WriteLine(r1 & "/" & r2 & "=" & (r1 / r2))
        Console.Out.WriteLine(r1 & "^2=" & (r1 ^ 2))
        Console.Out.WriteLine(Math.Cos(3))
    End Sub
End Module

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

4/3=1,33333333333333
4\3=1
4 mod 3=1
4,1/3,6=1,13888888888889
4,1^2=16,81
-0,989992496600445

توابع ریاضی مختلفی وجود دارند. در اینجا چند نمونه از آنها آورده شده است:


Public Shared Function Sqrt(ByVal d As Double ) As Double
جذر

[Visual Basic]
Public Shared Function Cos(ByVal d As Double ) As Double
کسینوس

Public Shared Function Sin(ByVal a As Double) As Double
سینوس

[Visual Basic]
Public Shared Function Tan(ByVal a As Double) As Double
تانژنت

[Visual Basic]
Public Shared Function Pow(ByVal x As Double,ByVal y As Double) As Double
x به توان y (x>0)

[Visual Basic]
Public Shared Function Exp(ByVal d As Double) As Double
نرخ رشد نمایی

[Visual Basic]
Overloads Public Shared Function Log( ByVal d As Double ) As Double
لگاریتم طبیعی

Overloads Public Shared Function Abs(ByVal value As Double ) As Double
مقدار مطلق
....
 

تمام این توابع در کلاسی به نام NET که Math نامیده می‌شود، تعریف شده‌اند. هنگام استفاده از آن‌ها، باید نام کلاسی که در آن تعریف شده‌اند را به عنوان پیش‌وند به آن‌ها اضافه کرد. بنابراین، به این صورت نوشته می‌شوند:

        Dim r1, r2 As Double
        r2 = Math.Sqrt(9)
        r1 = Math.Cos(3)

تعریف کامل کلاس Math به شرح زیر است:

E 
نماینده پایه لگاریتم طبیعی مشخص‌شده توسط عدد پی‌ان‌دبلیو است.
  
PI 
نسبت محیط یک دایره به قطر آن را که با ثابت π مشخص می‌شود، نشان می‌دهد.
  
Abs 
مبارز. مقدار مطلق یک عدد مشخص را برمی‌گرداند.
 
Acos 
زاویه‌ای را بازمی‌گرداند که کسینوس آن برابر با عدد مشخص‌شده است.
 
Asin 
زاویه‌ای را بازمی‌گرداند که سینوس آن عدد مشخص‌شده است.
 
Atan 
زاویه‌ای را بازمی‌گرداند که تانژانت آن برابر با عدد مشخص‌شده است.
 
Atan2 
زاویه‌ای را بازمی‌گرداند که تانژانت آن حاصل‌تقسیم دو عدد مشخص است.
 
BigMul
محصول انتگرال دو عدد ۳۲ بیتی را تولید می‌کند.
 
Ceiling 
کوچک‌ترین عدد صحیح بزرگ‌تر یا مساوی با عدد مشخص‌شده را برمی‌گرداند.
 
Cos 
کسینوس زاویه مشخص را برمی‌گرداند.
 
Cosh 
توابع کسینوس هذلولوی زاویه مشخص را برمی‌گرداند.
 
DivRem
دارای چندپادمان. حاصل تقسیم دو عدد را برمی‌گرداند و باقی‌مانده را به‌عنوان یک پارامتر خروجی ارسال می‌کند.
 
Exp 
مقدار e را به توان مشخص‌شده برمی‌گرداند.
 
Floor 
بزرگ‌ترین عدد صحیح کوچکتر یا مساوی با عدد مشخص‌شده را برمی‌گرداند.
 
IEEERemainder 
باقی‌مانده تقسیم یک عدد بر عدد دیگر را برمی‌گرداند.
 
Log 
دارای چندبار بارگذاری. لگاریتم عدد مشخص را برمی‌گرداند.
 
Log10 
مقدار لگاریتم مبنای ده یک عدد مشخص را برمی‌گرداند.
 
Max 
چندریختی. بزرگ‌تر از دو عدد مشخص را برمی‌گرداند.
 
Min 
بیش‌بارگذاری شده. کوچک‌تر از دو عدد را برمی‌گرداند.
 
Pow 
مقدار عدد مشخص را به توان مشخص برمی‌گرداند.
 
Round 
دارای بار اضافی. عددی را که به مقدار مشخص‌شده نزدیک‌تر است بازمی‌گرداند.
 
Sign 
دارای بار اضافی. مقداری را بازمی‌گرداند که نشان‌دهنده علامت یک عدد است.
 
Sin 
سینوس زاویه مشخص را برمی‌گرداند.
 
Sinh 
سینوس هیپربولیک زاویه مشخص را برمی‌گرداند.
 
Sqrt 
ریشه دوم یک عدد مشخص را برمی‌گرداند.
 
Tan 
تنگنس زاویه مشخص را برمی‌گرداند.
 
Tanh 
تنگنس هیپربولیک زاویه مشخص را برمی‌گرداند.
 

وقتی گفته می‌شود یک تابع «بارگذاری شده» (overloaded) است، یعنی برای انواع مختلف پارامترها وجود دارد. برای مثال، تابع Abs(x) برای x از نوع Integer، Long، Decimal، Single و Float وجود دارد. برای هر یک از این انواع، تعریف جداگانه‌ای از تابع Abs وجود دارد. در این صورت گفته می‌شود که بارگذاری شده است.

2.3.5.3. اولویت‌ها در ارزیابی عبارت‌های عددی

ترتیب اولویت عملگرها هنگام ارزیابی یک عبارت عددی به شرح زیر است (از بالاترین به پایین‌ترین):

دسته‌بندی
عملگرها
Primaire
تمام عبارت‌ها بدون عملگر: توابع، پرانتزها
Élévation à la puissance
^
Négation unaire
+, -
Multiplication
*, /
Division par un entier
\
Modulo
مد
Addition
+, -

2.3.5.4. بیان‌های رابطه‌ای

عملگرها به شرح زیر هستند:

Comparaison
=، <>، <، >، <=، >=، Like، Is

=: مساوی، <>: نامساوی، <: کوچکتر از (به طور دقیق)، >: بزرگتر از (به طور دقیق)، <=: کوچکتر یا مساوی، >=: بزرگتر یا مساوی، Like: مطابقت با الگو، Is: هویت شیء. تمام این عملگرها اولویت یکسانی دارند. آنها از چپ به راست ارزیابی می‌شوند. نتیجه یک عبارت رابطه‌ای یک مقدار بولی است.

مقایسهٔ رشته‌ای: برنامهٔ زیر را در نظر بگیرید:


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

Module string1
    Sub main()
        Dim ch1 As Char = "A"c
        Dim ch2 As Char = "B"c
        Dim ch3 As Char = "a"c
        Console.Out.WriteLine("A<B=" & (ch1 < ch2))
        Console.Out.WriteLine("A<a=" & (ch1 < ch3))
        Dim chat As String = "chat"
        Dim chien As String = "chien"
        Dim chaton As String = "chaton"
        Dim chat2 As String = "CHAT"
        Console.Out.WriteLine("chat<chien=" & (chat < chien))
        Console.Out.WriteLine("chat<chaton=" & (chat < chaton))
        Console.Out.WriteLine("chat<CHAT=" & (chat < chat2))
        Console.Out.WriteLine("chaton like chat*=" & ("chaton" Like "chat*"))
    End Sub
End Module

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

A<B=True
A<a=True
chat<chien=True
chat<chaton=True
chat<CHAT=False
chaton like chat*=True

فرض کنید دو کاراکتر C1 و C2 وجود داشته باشند. می‌توان آن‌ها را با استفاده از عملگرهای <، <=، =، <>، > و >= مقایسه کرد. این مقادیر یونیکد آن‌ها – که عدد هستند – هستند که با هم مقایسه می‌شوند. طبق ترتیب یونیکد، روابط زیر برقرار است:

فاصله < .. < '0' < '1' < .. < '9' < .. < 'A' < 'B' < .. < 'Z' < .. < 'a' < 'b' < .. < 'z'

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

2.3.5.5. بیان‌های بولی

عملگرها به شرح زیر هستند:

Opérations logiques/de bits
Not، And، Or، Xor، AndAlso، OrElse

Not: و منطقی، Or: یا منطقی، Not: نفی، Xor: یا انحصاری.

op1 AndAlso op2: اگر op1 درست باشد، op2 ارزیابی نمی‌شود و نتیجه درست است.

op1 OrElse op2: اگر op1 درست باشد، op2 ارزیابی نمی‌شود و نتیجه درست است.

اولویت این عملگرها نسبت به یکدیگر به شرح زیر است:

NOT logique
نه
AND logique
و، AndAlso
OR logique
یا، OrElse
XOR logique
XOR

نتیجه یک عبارت بولی یک مقدار بولی است.

2.3.5.6. عملیات بیت‌بیتی

از یک سو، همان عملگرهای موجود در حساب بولی را با همان اولویت می‌یابیم. همچنین دو عملگر جابجایی << و >> وجود دارند. فرض کنید i و j دو عدد صحیح باشند.

i<<n
i را به اندازه n بیت به سمت چپ جابجا می‌کند. بیت‌هایی که وارد می‌شوند صفر هستند.
i>>n
i را n بیت به سمت راست جابجا می‌کند. اگر i یک عدد صحیح علامت‌دار (signed char, int, long) باشد، بیت علامت حفظ می‌شود.
i & j
عملیات AND منطقی بیت به بیت i و j را انجام می‌دهد.
i | j
یک عملیات منطقی OR بیت به بیت بین i و j را انجام می‌دهد (OU).
~i
i را روی 1 تنظیم کنید
i^j
OU و EXCLUSIF را از i و j ایجاد می‌کند

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


Module operationsbit
    Sub main()
        ' دستکاری بیت
        Dim i As Short = &H123F
        Dim k As Short = &H7123
        Console.Out.WriteLine("i<<4=" & (i << 4).ToString("X"))
        Console.Out.WriteLine("i>>4=" & (i >> 4).ToString("X"))
        Console.Out.WriteLine("k>>4=" & (k >> 4).ToString("X"))
        Console.Out.WriteLine("i and 4=" & (i And 4).ToString("X"))
        Console.Out.WriteLine("i or 4 =" & (i Or 4).ToString("X"))
        Console.Out.WriteLine("not i=" & (Not i).ToString("X"))
    End Sub
End Module

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

i<<4=23F0
i>>4=123
k>>4=712
i and 4=4
i or k =123F
not i=EDC0

2.3.5.7. عملگر مرتبط با تخصیص

می‌توان a+=b را نوشت که به معنای a=a+b است. فهرست عملگرهایی که می‌توان با عملگر تخصیص ترکیب کرد به شرح زیر است:

combinaison d'opérateurs
^=، *=، /=، \=، +=، -=، &=

2.3.5.8. اولویت‌بندی کلی عملگرها

دسته‌بندی
عملگرها
Primaire
تمام عبارت‌ها بدون عملگر
Élévation à la puissance
^
Négation unaire
+, -
Multiplication
*, /
Division par un entier
\
Modulo
مد
Addition
+, -
Concaténation
و
Déplacement
<<, >>
Relationnel
=, <>, <, >, <=, >=, Like, Is, TypeOf...Is
NOT logique
نه
AND logique
و، AndAlso
OR logique
یا، OrElse
XOR logique
XOR

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

2.3.5.9. تبدیل انواع

تعداد زیادی تابع از پیش تعریف‌شده وجود دارد که به شما امکان می‌دهند از یک نوع داده به نوع دیگر تبدیل کنید. این توابع در زیر فهرست شده‌اند:

CBool,CByte,CChar,CDate,CDbl,CDec,CInt,CLng,CObj,CShort,CSng,CStr

این توابع به عنوان آرگومان، یا یک عبارت عددی یا یک رشته را می‌پذیرند. نوع نتیجه در جدول زیر نشان داده شده است:

تابع
نتیجه
محدوده مقادیر برای پارامتر تابع
CBool
منطقی
هر عبارت رشته‌ای یا عددی معتبر.
CByte
بایت
0 تا 255؛ کسری‌ها گرد می‌شوند.
CChar
کاراکتر
هر عبارت رشته‌ای معتبر؛ مقدار باید بین 0 و 65,535 باشد.
CDate
تاریخ
هر نمایش معتبر از تاریخ و زمان.
CDbl
دوبل
-1,79769313486231E+308 تا
-4,94065645841247E-324 برای مقادیر منفی؛ 4,94065645841247E-324 تا 1,79769313486231E+308 برای مقادیر مثبت.
CDec
ممیز
+/-79,228,162,514,264,337,593,543,950,335 برای اعداد بدون اعشار. بازه مقادیر برای اعداد با 28 رقم اعشاری است
+/-7.9228162514264337593543950335. کوچک‌ترین عدد غیرصفر 0.0000000000000000000000000001 است.
CInt
صدم
از -۲٬۱۴۷٬۴۸۳٬۶۴۸ تا ۲٬۱۴۷٬۴۸۳٬۶۴۷؛ کسری‌ها گرد می‌شوند.
CLng
طولانی
از -۹٬۲۲۳٬۳۷۲٬۰۳۶٬۸۵۴٬۷۷۵٬۸۰۸ تا ۹٬۲۲۳٬۳۷۲٬۰۳۶٬۸۵۴٬۷۷۵٬۸۰۷؛ کسری‌ها گرد شده‌اند.

CObj 
شیء
هر عبارت معتبر.
CShort
کوتاه
-۳۲٬۷۶۸ تا ۳۲٬۷۶۷؛ کسری‌ها گرد می‌شوند.
CSng
تکی
-3,402823E+38 تا -1,401298E-45 برای مقادیر منفی؛ 1,401298E-45 تا 3,402823E+38 برای مقادیر مثبت.
CStr
رشته
مقادیر بازگشتی تابع Cstr به آرگومان عبارت بستگی دارند.

در اینجا یک برنامهٔ نمونه آورده شده است:


Module conversion
    Sub main()
        Dim var1 As Boolean = CBool("true")
        Dim var2 As Byte = CByte("100")
        Dim var3 As Char = CChar("A")
        Dim var4 As Date = CDate("30 janvier 2004")
        Dim var5 As Double = CDbl("100,45")
        Dim var6 As Decimal = CDec("1000,67")
        Dim var7 As Integer = CInt("-30")
        Dim var8 As Long = CLng("456")
        Dim var9 As Short = CShort("-14")
        Dim var10 As Single = CSng("56,78")
        Console.Out.WriteLine("var1=" & var1)
        Console.Out.WriteLine("var2=" & var2)
        Console.Out.WriteLine("var3=" & var3)
        Console.Out.WriteLine("var4=" & var4)
        Console.Out.WriteLine("var5=" & var5)
        Console.Out.WriteLine("var6=" & var6)
        Console.Out.WriteLine("var7=" & var7)
        Console.Out.WriteLine("var8=" & var8)
        Console.Out.WriteLine("var9=" & var9)
        Console.Out.WriteLine("var10=" & var10)
    End Sub
End Module

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

var1=True
var2=100
var3=A
var4=30/01/2004
var5=100,45
var6=1000,67
var7=-30
var8=456
var9=-14
var10=56,78

توابع CType(expression, type) نیز قابل استفاده است، همانطور که در برنامه زیر نشان داده شده است:


Module ctype1
    Sub main()
        Dim var1 As Boolean = CType("true", Boolean)
        Dim var2 As Byte = CType("100", Byte)
        Dim var3 As Char = CType("A", Char)
        Dim var4 As Date = CType("30 janvier 2004", Date)
        Dim var5 As Double = CType("100,45", Double)
        Dim var6 As Decimal = CType("1000,67", Decimal)
        Dim var7 As Integer = CType("-30", Integer)
        Dim var8 As Long = CType("456", Long)
        Dim var9 As Short = CType("-14", Short)
        Dim var10 As Single = CType("56,78", Single)
        Dim var11 As String = CType("47,89", String)
        Dim var12 As String = 47.89.ToString
        Dim var13 As String = "" & 47.89
        Console.Out.WriteLine("var1=" & var1)
        Console.Out.WriteLine("var2=" & var2)
        Console.Out.WriteLine("var3=" & var3)
        Console.Out.WriteLine("var4=" & var4)
        Console.Out.WriteLine("var5=" & var5)
        Console.Out.WriteLine("var6=" & var6)
        Console.Out.WriteLine("var7=" & var7)
        Console.Out.WriteLine("var8=" & var8)
        Console.Out.WriteLine("var9=" & var9)
        Console.Out.WriteLine("var10=" & var10)
        Console.Out.WriteLine("var11=" & var11)
        Console.Out.WriteLine("var12=" & var12)
        Console.Out.WriteLine("var13=" & var13)
    End Sub
End Module

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

var1=True
var2=100
var3=A
var4=30/01/2004
var5=100,45
var6=1000,67
var7=-30
var8=456
var9=-14
var10=56,78
var11=47,89
var12=47,89
var13=47,89

2.4. دستورالعمل‌های نظارت بر پیشرفت برنامه

2.4.1. توقف

متد Exit که در کلاس Environment تعریف شده است، به شما امکان می‌دهد اجرای یک برنامه را متوقف کنید:


[Visual Basic]
Public Shared Sub Exit(ByVal exitCode As Integer )

فرآیند جاری را متوقف می‌کند و مقدار exitCode را به فرآیند والد بازمی‌گرداند. مقدار exitCode می‌تواند توسط فرآیند والد استفاده شود. در DOS، این متغیر وضعیت به DOS در متغیر سیستمی ERRORLEVEL بازگردانده می‌شود که مقدار آن را می‌توان در یک فایل دسته‌ای بررسی کرد. در یونیکس، متغیر $? مقدار exitCode را در خود نگه می‌دارد.

    Environment.Exit(0)

اجرای برنامه را با مقدار وضعیت 0 خاتمه می‌دهد.

2.4.2. ساختار تصمیم‌گیری ساده

if condition then
    actions_alors
else
    actions_sinon
end if
  • هر اقدام در یک خط جداگانه قرار دارد
  • بند else ممکن است حذف شود.

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


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

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

Module if1
    Sub main()
        Dim i As Integer = 10
        If i > 4 Then
            Console.Out.WriteLine(i & " est > " & 4)
        Else
            If i = 4 Then
                Console.Out.WriteLine(i & " est = " & 4)
            Else
                Console.Out.WriteLine(i & " est < " & 4)
            End If
        End If
    End Sub
End Module

نتیجهٔ به‌دست‌آمده:

10 est > 4

2.4.3. ساختار مورد

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

select case expression
    case liste_valeurs1
        actions1
case liste_valeurs2
        actions2
...
case else
        actions_sinon
end select
  • نوع [expression] باید یکی از انواع زیر باشد:
Boolean, Byte, Char, Date, Decimal, Double, Integer, Long, Object, Short, Single et String
  • بند [case else] می‌تواند حذف شود.
  • [liste_valeursi] مقادیر ممکن برای عبارت هستند. [listes_valeursi] نمایانگر فهرستی از شرایط است: condition1، condition2، …، conditionx. اگر [expression] هر یک از شرایط را برآورده کند، اقدامات پس از بند [liste_valeursi] اجرا می‌شوند. شرایط ممکن است به شکل زیر باشند:
  • val1 تا val2: true اگر [expression] عضو دامنه [val1,val2] باشد
  • val1: true اگر [expression] برابر با val1 باشد
  • is > val1: true اگر [expression] > val1 باشد. کلمه کلیدی [is] می‌تواند حذف شود
  • همین امر در مورد عملگرهای =، <، <=، >، >= و <> نیز صدق می‌کند.
  • فقط اقداماتی که با اولین شرطی که درست است مرتبط هستند اجرا می‌شوند.

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


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

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

Module selectcase1
    Sub main()
        Dim i As Integer = 10
        Select Case i
            Case 1 To 4, 7 To 8
                Console.Out.WriteLine("i est dans l'intervalle [1,4] ou [7,8]")
            Case Is > 12
                Console.Out.WriteLine("i est > 12")
            Case Is < 15
                Console.Out.WriteLine("i est < 15")
            Case Is < 20
                Console.Out.WriteLine("i est < 20")
        End Select
    End Sub
End Module

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

i est < 15

2.4.4. ساختار تکرار

2.4.4.1. تعداد تکرارهای معلوم


For counter [ As datatype ] = start To end [ Step step ]
   actions
Next [ counter ]

اقدامات برای هر مقداری که متغیر [counter] اختیار می‌کند، انجام می‌شوند. برنامه زیر را در نظر بگیرید:


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

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

Module for1
    Sub main()
        Dim somme As Integer = 0
        Dim résultat As String = "somme("
        For i As Integer = 0 To 10 Step 2
            somme += i
            résultat += " " + i.ToString
        Next
        résultat += ")=" + somme.ToString
        Console.Out.WriteLine(résultat)
    End Sub
End Module

نتایج:

somme( 0 2 4 6 8 10)=30

یک ساختار تکرار دیگر با تعداد تکرارهای معلوم به صورت زیر است:


For Each element [ As datatype ] In groupe
   [ actions ]
Next [ element ]
  • groupe یک مجموعه از اشیاء است. مجموعه‌ای از اشیاء که با آن آشنا هستیم، آرایه است.
  • datatype نوع اشیاء در مجموعه است. برای یک آرایه، این نوع، نوع عناصر آرایه خواهد بود
  • element متغیری است که به چرخه تعلق دارد و به ترتیب تمام مقادیر مجموعه را به خود اختصاص می‌دهد.

بنابراین، کد زیر:


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

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

Module foreach1
    Sub main()
        Dim amis() As String = {"paul", "hélène", "jacques", "sylvie"}
        For Each nom As String In amis
            Console.Out.WriteLine(nom)
        Next
    End Sub
End Module

نمایش داده می‌شود:

paul
hélène
jacques
sylvie

2.4.4.2. تعداد تکرارها نامشخص

در VB.NET برای این مورد ساختارهای متعددی وجود دارد.


Do { While | Until } condition
   [ statements ]
Loop

حلقه تا زمانی که شرط برقرار باشد (while) یا تا زمانی که شرط برقرار شود (until) ادامه می‌یابد. ممکن است هرگز اجرا نشود.


Do
   [ statements ]
Loop { While | Until } condition

حلقه تا زمانی که شرط برقرار باشد (while) یا تا زمانی که شرط برقرار شود (until) ادامه می‌یابد. حلقه همیشه حداقل یک بار اجرا می‌شود.


While condition
   [ statements ]
End While

حلقه تا زمانی که شرط برقرار باشد ادامه می‌یابد. ممکن است حلقه هرگز اجرا نشود. حلقه‌های زیر همگی مجموع ۱۰ عدد صحیح اول را محاسبه می‌کنند.


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

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

Module boucles1
    Sub main()
        Dim i, somme As Integer
        i = 0 : somme = 0
        Do While i < 11
            somme += i
            i += 1
        Loop
        Console.Out.WriteLine("somme=" + somme.ToString)
        i = 0 : somme = 0
        Do Until i = 11
            somme += i
            i += 1
        Loop
        Console.Out.WriteLine("somme=" + somme.ToString)
        i = 0 : somme = 0
        Do
            somme += i
            i += 1
        Loop Until i = 11
        Console.Out.WriteLine("somme=" + somme.ToString)
        i = 0 : somme = 0
        Do
            somme += i
            i += 1
        Loop While i < 11
        Console.Out.WriteLine("somme=" + somme.ToString)
    End Sub
End Module
somme=55
somme=55
somme=55
somme=55

2.4.4.3. دستورالعمل‌های مدیریت حلقه

exit do
خروج از حلقه do...loop
exit for
خروج از حلقه for

2.5. ساختار یک برنامه VB.NET

یک برنامه VB.NET که از هیچ کلاس یا تابع تعریف‌شده توسط کاربر به جز تابع اصلی Main استفاده نمی‌کند، ممکن است ساختار زیر را داشته باشد:


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

' فضاهای نام
Imports espace1
Imports ....

Module nomDuModule
    Sub main()
....
    End Sub
End Module
  • دستور [Option Explicit on] اعلام متغیر را الزامی می‌کند. در VB.NET، این امر اجباری نیست. بنابراین یک متغیر اعلام‌نشده از نوع Object است.
  • دستور [Option Strict on] هرگونه تبدیل نوع داده‌ای را که منجر به از دست رفتن داده‌ها شود و همچنین هرگونه تبدیل بین انواع عددی و رشته‌ای ممنوع می‌کند. بنابراین باید از توابع تبدیل به‌طور صریح استفاده شود.
  • برنامه تمام نام‌فضه‌هایی را که نیاز دارد وارد می‌کند. ما هنوز این مفهوم را معرفی نکرده‌ایم. در برنامه‌های قبلی، اغلب با دستورات مشابهی مواجه شده‌ایم:
        Console.Out.WriteLine(unechaine)

در واقع باید می‌نوشتیم:

        System.Console.Out.WriteLine(unechaine)

که در آن System فضای نامی حاوی کلاس [Console] است. با وارد کردن فضای نام [System] با استفاده از عبارت Imports، VB.NET هرگاه با کلاسی مواجه شود که آن را نمی‌شناسد، به‌طور سیستماتیک در آن جستجو خواهد کرد. این جستجو را در تمام فضاهای نام اعلام‌شده تکرار می‌کند تا کلاسی را که به دنبالش است پیدا کند. بنابراین می‌نویسیم:


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

        Console.Out.WriteLine(unechaine)

یک برنامهٔ نمونه ممکن است به این شکل باشد:


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

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

' ماژول اصلی
Module main1
    Sub main()
        Console.Out.WriteLine("main1")
    End Sub
End Module

همان برنامه را می‌توان به صورت زیر نوشت:


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

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

' کلاس آزمایشی
Public Class main2
    Public Shared Sub main()
        Console.Out.WriteLine("main2")
    End Sub
End Class

در اینجا از مفهوم کلاس استفاده می‌کنیم که در فصل بعد معرفی خواهد شد. وقتی چنین کلاسی شامل یک رویهٔ ایستا (اشتراکی) به نام «main» باشد، این رویه اجرا می‌شود. ما این نشانه را اینجا معرفی می‌کنیم زیرا C#، زبان خواهر VB.NET، تنها مفهوم کلاس را می‌شناسد، c.a.d، به این معنی که تمام کدهای اجرا شده لزوماً باید به یک کلاس تعلق داشته باشند. مفهوم کلاس بخشی از برنامه‌نویسی شیءگرا است. تحمیل آن بر طراحی هر برنامه‌ای تا حدی دست‌وپاگیر است. ما می‌توانیم این را در اینجا در نسخه ۲ برنامه قبلی ببینیم، که در آن ما به معرفی مفاهیم کلاس‌ها و متدهای ایستا در جاهایی که نیازی به آنها نیست، وادار می‌شویم. بنابراین، از این پس، ما فقط زمانی مفهوم کلاس را معرفی خواهیم کرد که ضروری باشد. در موارد دیگر، از مفهوم ماژول استفاده خواهیم کرد، همانند نسخه ۱ بالا.

2.6. کامپایل و اجرای یک برنامه VB.NET

برای کامپایل یک برنامه VB.NET تنها به فایل SDK.NET نیاز است. بیایید برنامه زیر را در نظر بگیریم:


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

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

Module boucles1
    Sub main()
        Dim i, somme As Integer
        i = 0 : somme = 0
        Do While i < 11
            somme += i
            i += 1
        Loop
        Console.Out.WriteLine("somme=" + somme.ToString)
        i = 0 : somme = 0
        Do Until i = 11
            somme += i
            i += 1
        Loop
        Console.Out.WriteLine("somme=" + somme.ToString)
        i = 0 : somme = 0
        Do
            somme += i
            i += 1
        Loop Until i = 11
        Console.Out.WriteLine("somme=" + somme.ToString)
        i = 0 : somme = 0
        Do
            somme += i
            i += 1
        Loop While i < 11
        Console.Out.WriteLine("somme=" + somme.ToString)
    End Sub
End Module

فرض کنیم این برنامه در فایلی به نام [boucles1.vb] قرار دارد. برای کامپایل آن، به شرح زیر عمل می‌کنیم:

dos>dir boucles1.vb
11/03/2004  15:55                  583 boucles1.vb

dos>vbc boucles1.vb
Compilateur Microsoft (R) Visual Basic .NET version 7.10.3052.4
pour Microsoft (R) .NET Framework version 1.1.4322.573
Copyright (C) Microsoft Corporation 1987-2002. Tous droits réservés.

dos>dir boucles1.*
11/03/2004  16:04                  601 boucles1.vb
11/03/2004  16:04                3 584 boucles1.exe

برنامه vbc.exe کامپایلر VB.NET است. در اینجا، آن در PATH از DOS بود:


dos>path
PATH=E:\Program Files\Microsoft Visual Studio .NET 2003\Common7\IDE;E:\Program Files\Microsoft Visual Studio .NET 2003\VC7\BIN;E:\Program Files\Microsoft Visual Studio .NET 2003\Common7\Tools;E:\Program Files\Microsoft Visual Studio .NET 2003\Common7\Tools\bin\prerelease;E:\Program Files\Microsoft Visual Studio .NET 2003\Common7\Tools\bin;E:\Program Files\Microsoft Visual Studio .NET 2003\SDK\v1.1\bin;E:\WINNT\Microsoft.NET\Framework\v1.1.4322;e:\winnt\system32;e:\winnt;

dos>dir E:\WINNT\Microsoft.NET\Framework\v1.1.4322\vbc.exe
21/02/2003  10:20              737 280 vbc.exe

کامپایلر [vbc] یک فایل .exe تولید می‌کند که می‌تواند توسط ماشین مجازی .NET اجرا شود:

dos>boucles1
somme=55
somme=55
somme=55
somme=55

2.7. مثال IMPOTS

ما قصد داریم برنامه‌ای برای محاسبه بدهی مالیاتی یک مؤدی بنویسیم. در این برنامه، مورد ساده‌شده مؤدی‌ای را در نظر می‌گیریم که تنها حقوق خود را برای اظهارنامه دارد:

  • ما تعداد پله های مالیاتی کارمند را به صورت nbParts = nbEnfants/2 + 1 در صورتی که متأهل نباشد، محاسبه می‌کنیم، nbEnfants/2 + 2 اگر متأهل باشند، که در آن nbEnfants تعداد فرزندان آنهاست.
  • اگر حداقل سه فرزند داشته باشند، مستحق دریافت نیم‌پرداخت اضافی هستند
  • درآمد مشمول مالیات او به صورت R = 0.72 × S محاسبه می‌شود، که در آن S حقوق سالانه او است.
  • ضریب خانوادگی او به صورت QF = R / nbParts محاسبه می‌شود
  • مالیات I او محاسبه می‌شود. جدول زیر را در نظر بگیرید:
۱۲٬۶۲۰٫۰
0
0
۱۳٬۱۹۰
0.05
۶۳۱
۱۵٬۶۴۰
0.1
۱٬۲۹۰٫۵
۲۴٬۷۴۰
0.15
۲٬۰۷۲٫۵
۳۱٬۸۱۰
0.2
۳٬۳۰۹٫۵
۳۹٬۹۷۰
0.25
۴٬۹۰۰
۴۸٬۳۶۰
0.3
۶۸۹۸.۵
۵۵٬۷۹۰
0.35
۹٬۳۱۶٫۵
۹۲٬۹۷۰
0.4
۱۲٬۱۰۶
۱۲۷٬۸۶۰
0.45
۱۶٬۷۵۴٫۵
۱۵۱٬۲۵۰
0.50
۲۳٬۱۴۷٫۵
۱۷۲٬۰۴۰
0.55
۳۰٬۷۱۰
۱۹۵٬۰۰۰
0.60
۳۹٬۳۱۲
0
0.65
۴۹٬۰۶۲

هر سطر دارای ۳ فیلد است. برای محاسبه مالیات I، به دنبال اولین سطری می‌گردیم که QFfield1 باشد. برای مثال، اگر QF = 23000 باشد، سطر را پیدا خواهیم کرد

    24740        0.15        2072.5

مالیات I در این صورت برابر است با 0.15*R - 2072.5*nbParts. اگر QF به گونه‌ای باشد که شرط QF <= field1 هرگز برقرار نشود، ضرایب مربوط به آخرین خط استفاده می‌شوند. در این صورت:

    0                0.65        49062

که مالیات I = 0.65*R – 49062*nbParts را می‌دهد. برنامه متناظر VB.NET به شرح زیر است:


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

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

Module impots
    ' ------------ اصلی
    Sub Main()

        ' جدول‌های داده‌ای مورد نیاز برای محاسبه مالیات
        Dim Limites() As Decimal = {12620D, 13190D, 15640D, 24740D, 31810D, 39970D, 48360D, 55790D, 92970D, 127860D, 151250D, 172040D, 195000D, 0D}
        Dim CoeffN() As Decimal = {0D, 631D, 1290.5D, 2072.5D, 3309.5D, 4900D, 6898.5D, 9316.5D, 12106D, 16754.5D, 23147.5D, 30710D, 39312D, 49062D}

        'بازیابی وضعیت تأهل
        Dim OK As Boolean = False
        Dim reponse As String = Nothing
        While Not OK
            Console.Out.Write("Etes-vous marié(e) (O/N) ? ")
            reponse = Console.In.ReadLine().Trim().ToLower()
            If reponse <> "o" And reponse <> "n" Then
                Console.Error.WriteLine("Réponse incorrecte. Recommencez")
            Else
                OK = True
            End If
        End While
        Dim Marie As Boolean = reponse = "o"

        ' تعداد فرزندان
        OK = False
        Dim NbEnfants As Integer = 0
        While Not OK
            Console.Out.Write("Nombre d'enfants : ")
            reponse = Console.In.ReadLine()
            Try
                NbEnfants = Integer.Parse(reponse)
                If NbEnfants >= 0 Then
                    OK = True
                Else
                    Console.Error.WriteLine("Réponse incorrecte. Recommencez")
                End If
            Catch
                Console.Error.WriteLine("Réponse incorrecte. Recommencez")
            End Try
        End While
        ' حقوق
        OK = False
        Dim Salaire As Integer = 0
        While Not OK
            Console.Out.Write("Salaire annuel : ")
            reponse = Console.In.ReadLine()
            Try
                Salaire = Integer.Parse(reponse)
                If Salaire >= 0 Then
                    OK = True
                Else
                    Console.Error.WriteLine("Réponse incorrecte. Recommencez")
                End If
            Catch
                Console.Error.WriteLine("Réponse incorrecte. Recommencez")
            End Try
        End While
        'محاسبه تعداد سهام
        Dim NbParts As Decimal
        If Marie Then
            NbParts = CDec(NbEnfants) / 2 + 2
        Else
            NbParts = CDec(NbEnfants) / 2 + 1
        End If
        If NbEnfants >= 3 Then
            NbParts += 0.5D
        End If
        ' درآمد مشمول مالیات
        Dim Revenu As Decimal
        Revenu = 0.72D * Salaire

        ' ضریب خانوادگی
        Dim QF As Decimal
        QF = Revenu / NbParts

        ' تعیین بازه مالیاتی متناظر با QF
        Dim i As Integer
        Dim NbTranches As Integer = Limites.Length
        Limites((NbTranches - 1)) = QF
        i = 0
        While QF > Limites(i)
            i += 1
        End While
        'مالیات
        Dim impots As Integer = CInt(i * 0.05D * Revenu - CoeffN(i) * NbParts)

        ' نتیجه نمایش داده می‌شود
        Console.Out.WriteLine(("Impôt à payer : " & impots))
    End Sub
End Module

برنامه در یک پنجره DOS با استفاده از:

dos>vbc impots1.vb
Compilateur Microsoft (R) Visual Basic .NET version 7.10.3052.4 pour Microsoft (R) .NET Framework version 1.1.4322.573

dos>dir impots1.exe
24/02/2004  15:42                5 632 impots1.exe

مجموعه‌سازی یک فایل اجرایی به نام impots.exe تولید می‌کند. شایان ذکر است که impots.exe به‌طور مستقیم توسط پردازنده قابل اجرا نیست. در واقع حاوی کد میانی است که تنها روی پلتفرم .NET قابل اجرا است. نتایج به‌دست‌آمده به شرح زیر است:

dos>impots1
Etes-vous marié(e) (O/N) ? o
Nombre d'enfants : 3
Salaire annuel : 200000
Impôt à payer : 16400
dos>impots1
Etes-vous marié(e) (O/N) ? n
Nombre d'enfants : 2
Salaire annuel : 200000
Impôt à payer : 33388
dos>impots1
Etes-vous marié(e) (O/N) ? w
Réponse incorrecte. Recommencez
Etes-vous marié(e) (O/N) ? q
Réponse incorrecte. Recommencez
Etes-vous marié(e) (O/N) ? o
Nombre d'enfants : q
Réponse incorrecte. Recommencez
Nombre d'enfants : 2
Salaire annuel : q
Réponse incorrecte. Recommencez
Salaire annuel : 1
Impôt à payer : 0

2.8. آرگومان‌های اصلی برنامه

روال اصلی Main می‌تواند یک آرایه از رشته‌ها را به‌عنوان پارامتر بپذیرد:


    Sub main(ByVal args() As String)

پارامتر **args** یک آرایه از رشته‌های متنی است که استدلال‌های ارسال‌شده از طریق خط فرمان هنگام فراخوانی برنامه را دریافت می‌کند.

  • args.Length تعداد عناصر آرایه args است.
  • args(i) عنصر i-ام آرایه است

اگر برنامه P با دستور زیر اجرا شود: P arg0 arg1argn و اگر رویه Main در برنامه P به صورت زیر اعلام شده باشد:


    Sub main(ByVal args() As String)

ما arg(0)="arg0"، arg(1)="arg1" … خواهیم داشت. در اینجا یک مثال:


' راهنماها
Option Strict On
Option Explicit On 

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

Module arg
    Sub main(ByVal args() As String)
        ' تعداد آرگومان‌ها
        console.out.writeline("Il y a " & args.length & " arguments")
        Dim i As Integer
        For i = 0 To args.Length - 1
            Console.Out.WriteLine("argument n° " & i & "=" & args(i))
        Next
    End Sub
End Module

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

dos>arg1 a b c
Il y a 3 arguments
argument n° 0=a
argument n° 1=b
argument n° 2=c

2.9. شمارش‌ها

انومریزیشن یک نوع داده است که دامنهٔ مقادیر آن مجموعه‌ای از ثابت‌های عددی است. در نظر بگیرید برنامه‌ای باید نمرات امتحانی را مدیریت کند. این نمرات پنج‌تا هستند: Pass، AssezBien، Good، TrèsBien، Excellent. سپس می‌توانیم برای این پنج ثابت یک انومریزیشن تعریف کنیم:


    Enum mention
        Passable
        AssezBien
        Bien
        TrésBien
        Excellent
    End Enum

درون‌سازه‌ای، این پنج ثابت با اعداد صحیح پشت سر هم نمایش داده می‌شوند که برای اولین ثابت از 0، برای ثابت بعدی از 1 و به همین ترتیب شروع می‌شود. یک متغیر می‌تواند در enumeration برای پذیرش این مقادیر اعلام شود:


         ' یک متغیر که مقادیر خود را از enumeration 'mention' می‌گیرد
        Dim maMention As mention = mention.Passable

یک متغیر را می‌توان با مقادیر مختلف ممکن در شمارش‌شده مقایسه کرد:


         ' آزمون با استفاده از مقداری از فهرست شماری
        If (maMention = mention.Passable) Then
            Console.Out.WriteLine("Peut mieux faire")
        End If

می‌توانید تمام مقادیر موجود در شمارش را بازیابی کنید:


        For Each m In mention.GetValues(maMention.GetType)
            Console.Out.WriteLine(m)
        Next

همانطور که نوع ساده Integer معادل ساختار Int32 است، نوع ساده Enum معادل ساختار Enum است. این کلاس یک متد استاتیک به نام GetValues دارد که تمام مقادیر یک نوع شمارشی را که به‌عنوان پارامتر ارسال شده است، بازیابی می‌کند. این پارامتر باید یک شیء از نوع Type باشد، کلاسی که اطلاعات مربوط به یک نوع داده را فراهم می‌کند. نوع یک متغیر v با استفاده از v.GetType() به دست می‌آید. بنابراین در اینجا، maMention.GetType() شیء Type را برای شمارش mentions، و Enum.GetValues بازمی‌گرداند.(maMention.GetType()) فهرست مقادیر برای شمارش mentions.

این موضوع در برنامه زیر نشان داده شده است:


' دستورالعمل‌ها
Option Strict On
Option Explicit On 

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

Public Module enum2

    ' یک شمارش‌شده
    Enum mention
        Passable
        AssezBien
        Bien
        TrèsBien
        Excellent
    End Enum

    ' صفحهٔ آزمایشی
    Sub Main()

        ' یک متغیر که مقادیر خود را از شمارش مشخص‌شده می‌گیرد
        Dim maMention As mention = mention.Passable

        'نمایش مقدار یک متغیر
        Console.Out.WriteLine("mention=" & maMention)

        ' آزمون با استفاده از مقداری از شمارش‌گر
        If (maMention = mention.Passable) Then
            Console.Out.WriteLine("Peut mieux faire")
        End If

        ' فهرست ورودی‌های تحت‌اللفظی
        For Each m As mention In [Enum].GetValues(maMention.GetType)
            Console.Out.WriteLine(m.ToString)
        Next

        ' فهرست کل ورودی‌ها
        For Each m As Integer In [Enum].GetValues(maMention.GetType)
            Console.Out.WriteLine(m)
        Next
    End Sub
End Module

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

dos>enum2
mention=0
Peut mieux faire
Passable
AssezBien
Bien
TrèsBien
Excellent
0
1
2
3
4

2.10. مدیریت استثنا

بسیاری از توابع VB.NET قادر به تولید استثنا (خطا) هستند. وقتی یک تابع قادر به تولید استثنا باشد، برنامه‌نویس باید آن را مدیریت کند تا برنامه‌هایی مقاوم‌تر در برابر خطاها تولید شوند: همیشه باید از «کرش» ناگهانی برنامه جلوگیری کرد.

استثناء به شرح زیر مدیریت می‌شود:

try
    appel de la fonction susceptible de générer l'exception
catch  e as Exception e)
    traiter l'exception e
end try
instruction suivante

اگر تابع استثنا پرتاب نکند، برنامه به دستور بعدی ادامه می‌دهد؛ در غیر این صورت، وارد بدنه بند catch شده و سپس به دستور بعدی ادامه می‌دهد. به نکات زیر توجه کنید:

  • `e` یک شیء مشتق از نوع `Exception` است. می‌توانیم با استفاده از نوع‌هایی مانند `IOException`، `SystemException` و غیره، مشخص‌تر عمل کنیم: چندین نوع استثنا وجود دارد. با نوشتن `catch e as Exception`، نشان می‌دهیم که می‌خواهیم تمام انواع استثناها را مدیریت کنیم. اگر کد در بند `try` احتمالاً چندین نوع استثنا تولید کند، ممکن است بخواهیم با مدیریت استثنا با چندین بند `catch`، مشخص‌تر عمل کنیم:
try
    appel de la fonction susceptible de générer l'exception
catch e as IOException 
    traiter l'exception e
catch  e as SystemException
    traiter l'exception e
end try
instruction suivante
  • یک بند «finally» می‌تواند به بندهای try/catch اضافه شود:
try
    appel de la fonction susceptible de générer l'exception
catch  e as Exception
    traiter l'exception e
finally
    code exécuté après try ou catch
end try
instruction suivante

چه استثنایی وجود داشته باشد یا نه، کد در بند finally همیشه اجرا خواهد شد.

  • در بند catch، ممکن است نخواهید از شی Exception موجود استفاده کنید. به جای نوشتن `catch e as Exception`، باید `catch` را بنویسید.
  • کلاس Exception دارای خاصیتی به نام `Message` است که پیامی حاوی جزئیات خطای رخ‌داده را در خود جای داده است. بنابراین، اگر بخواهید این پیام را نمایش دهید، باید بنویسید:
catch e as Exception
    Console.Error.WriteLine("L'erreur suivante s'est produite : "+e.Message);
    ...
end try
  • کلاس Exception دارای متدی به نام ToString است که رشته‌ای را بازمی‌گرداند که نوع استثنا و همچنین مقدار خاصیت Message را نشان می‌دهد. بنابراین می‌توانیم بنویسیم:
catch  ex as Exception
    Console.Error.WriteLine("L'erreur suivante s'est produite : "+ex.ToString)
    ...
end try

مثال زیر یک استثنا را نشان می‌دهد که با استفاده از یک عنصر آرایهٔ وجود نداشته ایجاد شده است:


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

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

Module tab1
    Sub Main()
        ' اعلام و مقداردهی اولیهٔ یک آرایه
        Dim tab() As Integer = {0, 1, 2, 3}
        Dim i As Integer

        'نمایش یک آرایه با استفاده از حلقهٔ «for»
        For i = 0 To tab.Length - 1
            Console.Out.WriteLine(("tab[" & i & "]=" & tab(i)))
        Next i

        'نمایش یک آرایه با استفاده از حلقه for
        Dim élmt As Integer
        For Each élmt In tab
            Console.Out.WriteLine(élmt)
        Next élmt

        ' انداختن یک استثنا
        Try
            tab(100) = 6
        Catch e As Exception
            Console.Error.WriteLine(("L'erreur suivante s'est produite : " & e.Message))
        End Try
    End Sub
End Module

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

dos>exception1
tab[0]=0
tab[1]=1
tab[2]=2
tab[3]=3
0
1
2
3
L'erreur suivante s'est produite : L'index se trouve en dehors des limites du tableau.

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


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

'وارداتی
Imports System

Public Module console1
  Public Sub Main()
    ' درخواست نام
    System.Console.Write("Nom : ")

        ' خواندن پاسخ
    Dim nom As String = System.Console.ReadLine()

        ' سن درخواست‌شده
    Dim age As Integer
    Dim ageOK As Boolean = False
    Do While Not ageOK
      ' سؤال
      Console.Out.Write("âge : ")
      ' خواندن و تأیید پاسخ
      Try
        age = Int32.Parse(System.Console.ReadLine())
        If age < 0 Then Throw New Exception
        ageOK = True
      Catch
        Console.Error.WriteLine("Age incorrect, recommencez...")
      End Try
    Loop

        ' نمایش نهایی
    Console.Out.WriteLine("Vous vous appelez [" & nom & "] et vous avez [" & age & "] ans")
  End Sub
End Module

برخی از نتایج اجرا:

dos>console1
Nom : dupont
âge : 23
Vous vous appelez dupont et vous avez 23 ans
dos>console1
Nom : dupont
âge : xx
Age incorrect, recommencez...
âge : 12
Vous vous appelez dupont et vous avez 12 ans

2.11. ارسال پارامترها به یک تابع

در اینجا می‌بینیم که پارامترها چگونه به یک تابع ارسال می‌شوند. بیایید تابع زیر را در نظر بگیریم:


    Sub changeInt(ByVal a As Integer)
        a = 30
        Console.Out.WriteLine(("Paramètre formel a=" & a))
    End Sub    

در تعریف تابع، a به عنوان یک پارامتر اسمی (formal parameter) اشاره شده است. این تنها به منظور تعریف تابع changeInt گنجانده شده است. می‌توانست به همان آسانی b نامیده شود. اکنون بیایید مثالی از نحوه استفاده این تابع را بررسی کنیم:


    Sub Main()
        Dim age As Integer = 20
        changeInt(age)
        Console.Out.WriteLine(("Paramètre effectif age=" & age))
    End Sub

در اینجا، در عبارت changeInt(age)، age پارامتر حقیقی است که مقدار خود را به پارامتر صوری a پاس می‌دهد. ما علاقه‌مندیم بدانیم یک پارامتر فرمال چگونه مقدار پارامتر حقیقی متناظر را بازیابی می‌کند.

2.11.1. ارسال به ازای مقدار

مثال زیر نشان می‌دهد که پارامترهای یک تابع یا رویه به‌طور پیش‌فرض به صورت ارجاع به مقدار (pass-by-value) ارسال می‌شوند: یعنی مقدار پارامتر حقیقی در پارامتر شکلی متناظر کپی می‌شود. این دو موجودیت مجزا هستند. اگر تابع پارامتر شکلی را تغییر دهد، پارامتر حقیقی کاملاً بدون تغییر باقی می‌ماند.


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

' ارسال پارامترها به صورت مقدار به یک تابع
Imports System

Module param1
    Sub Main()
        Dim age As Integer = 20
        changeInt(age)
        Console.Out.WriteLine(("Paramètre effectif age=" & age))
    End Sub

    Sub changeInt(ByVal a As Integer)
        a = 30
        Console.Out.WriteLine(("Paramètre formel a=" & a))
    End Sub
End Module

نتایج به‌دست‌آمده به شرح زیر است:

Paramètre formel a=30
Paramètre effectif age=20

مقدار ۲۰ پارامتر واقعی به پارامتر صوری a کپی شد. سپس این مقدار تغییر داده شد. پارامتر واقعی بدون تغییر باقی ماند. این روش ارسال برای پارامترهای ورودی یک تابع مناسب است.

2.11.2. ارجاعی

در ارسال به صورت مرجع، پارامتر حقیقی و پارامتر صوری یکی هستند. اگر تابع پارامتر صوری را تغییر دهد، پارامتر حقیقی نیز تغییر می‌کند. در VB.NET، پارامتر صوری باید با کلمه کلیدی ByRef پیش‌فرض شود. در اینجا یک مثال آورده شده است:


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

'ارسال پارامترها به صورت مقدار به یک تابع
Imports System

Module param2
    Sub Main()
        Dim age As Integer = 20
        changeInt(age)
        Console.Out.WriteLine(("Paramètre effectif age=" & age))
    End Sub

    Sub changeInt(ByRef a As Integer)
        a = 30
        Console.Out.WriteLine(("Paramètre formel a=" & a))
    End Sub
End Module

و نتایج اجرا:

Paramètre formel a=30
Paramètre effectif age=30

پارامتر واقعی برای انعکاس تغییر در پارامتر صوری به‌روزرسانی شده است. این روش ارسال برای پارامترهای خروجی یک تابع مناسب است.