2. مبانی زبان VB.NET
2.1. مقدمه
ابتدا VB.NET را بهعنوان یک زبان برنامهنویسی متعارف در نظر میگیریم. بعداً به اشیاء خواهیم پرداخت.
در یک برنامه، دو نوع چیز وجود دارد
- دادهها
- دستورالعملهایی که آن را دستکاری میکنند
ما معمولاً سعی میکنیم دادهها را از دستورالعملها جدا کنیم:
![]() |
2.2. دادهها در VB.NET
VB.NET از انواع داده زیر استفاده میکند:
- اعداد صحیح، اعداد حقیقی و اعشاری
- نوارها و رشتههای متنی
- بولها
- تاریخها
- ابجکتها
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. نشانهگذاری برای دادههای صریح
145, -7, &FF (هگزادسیمال) | |
100000L | |
۱۳۴٫۷۸۹، ۴۵×۱۰⁻¹⁸ (−۴۵ × ۱۰⁻¹⁸) | |
134.789F, -45E-18F (-45 × 10⁻¹⁸) | |
100000D | |
"A"c | |
"امروز" | |
true, false | |
تاریخ جدید (۲۰۰۳، ۱، ۱) برای ۰۱/۰۱/۲۰۰۳ |
به نکات زیر توجه کنید:
- 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]. چرا ثابتها را اعلام کنیم؟
- خوانایی برنامه با دادن نام معنادار به ثابت آسانتر میشود: [const taux_tva as single=0.186F]
- در صورتی که نیاز به تغییر «ثابت» باشد، اصلاح برنامه آسانتر خواهد بود. بنابراین، در مثال قبلی، اگر نرخ مالیات بر ارزش افزوده به ۳۳ درصد افزایش یابد، تنها تغییری که لازم است اعمال شود، اصلاح عبارت تعریفکننده مقدار آن خواهد بود: [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.ToString یا "" & number یا CType(number, String) | |
objet.ToString | |
Integer.Parse(string) یا Int32.Parse | |
Long.Parse (string) or Int64.Parse | |
Double.Parse (string) | |
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 دستورالعملهایی که جریان برنامه را کنترل میکنند.
دستورات پایه زمانی روشن میشوند که ساختار یک ریزرایانه و اجزای جانبی آن را در نظر بگیریم.
![]() |
-
خواندن اطلاعات از صفحهکلید
-
پردازش اطلاعات
-
نوشتن اطلاعات روی صفحه نمایش
-
خواندن اطلاعات از یک فایل دیسکی
-
نوشتن اطلاعات در یک فایل دیسکی
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
و نتایج اجرای آن:
دستورالعملها
Dim obj As New Object
Console.Out.WriteLine(obj.ToString)
فقط برای نشان دادن اینکه هر شیئی را میتوان نمایش داد، گنجانده شدهاند. ما در اینجا تلاش نمیکنیم معنای آنچه نمایش داده میشود را توضیح دهیم.
2.3.4. انحراف ورودی/خروجی
در DOS/Windows، سه دستگاه استاندارد وجود دارد که به نامهای زیر شناخته میشوند:
- دستگاه ورودی استاندارد – بهطور پیشفرض به صفحهکلید اشاره دارد و شمارهٔ آن 0 است
- دستگاه خروجی استاندارد – بهطور پیشفرض به صفحه نمایش اشاره دارد و شمارهٔ آن ۱ است
- دستگاه خطای استاندارد – بهطور پیشفرض به صفحه نمایش اشاره دارد و شمارهٔ ۲ را دارد.
در VB.NET، جریان خروجی Console.Out به دستگاه 1، جریان خروجی Console.Error به دستگاه 2 و جریان ورودی Console.In از دستگاه 0 داده میخواند. هنگام اجرای یک برنامه در پنجرهٔ DOS زیر ویندوز، میتوانید مشخص کنید که کدام دستگاهها برای برنامهٔ در حال اجرا برابر 0، 1 و 2 باشند. خط فرمان زیر را در نظر بگیرید:
با استفاده از آرگومانهای argi برنامه pg، دستگاههای ورودی/خروجی استاندارد را میتوان به فایلها هدایت کرد:
جریان ورودی استاندارد شماره ۰ به فایل in.txt هدایت میشود. بنابراین در برنامه، جریان Console.In دادههای خود را از فایل in.txt خواهد گرفت. | |||
خروجی شماره ۱ را به فایل out.txt هدایت میکند. در نتیجه، در داخل برنامه، جریان Console.Out دادههای خود را به فایل out.txt خواهد نوشت. | |||
همین امر صدق میکند، اما دادههای نوشته شده به محتویات فعلی فایل out.txt ضمیمه میشوند. | |||
خروجی شماره ۲ را به فایل error.txt هدایت میکند. این بدان معناست که، در داخل برنامه، جریان Console.Error دادههای خود را به فایل error.txt خواهد نوشت. | |||
همین امر صدق میکند، اما دادههای نوشته شده به محتویات فعلی فایل 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>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. فهرست عملگرها
عمل | عنصر زبان |
^, –, *, /, \, Mod, +, = | |
=, ^=, *=, /=, \=, +=, -=, &= | |
=, <>, <, >, <=, >=, Like, Is | |
و، + | |
نه، و، یا، ایکساور، AndAlso، OrElse | |
AddressOf, GetType |
2.3.5.2. بیان جبری
عملگرهای مورد استفاده در عبارتهای عددی به شرح زیر هستند:
^, –, *, /, \, 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
نتایج زیر را تولید میکند:
توابع ریاضی مختلفی وجود دارند. در اینجا چند نمونه از آنها آورده شده است:
| جذر |
| کسینوس |
| سینوس |
| تانژنت |
| x به توان y (x>0) |
| نرخ رشد نمایی |
| لگاریتم طبیعی |
| مقدار مطلق |
تمام این توابع در کلاسی به نام NET که Math نامیده میشود، تعریف شدهاند. هنگام استفاده از آنها، باید نام کلاسی که در آن تعریف شدهاند را به عنوان پیشوند به آنها اضافه کرد. بنابراین، به این صورت نوشته میشوند:
تعریف کامل کلاس Math به شرح زیر است:
نماینده پایه لگاریتم طبیعی مشخصشده توسط عدد پیاندبلیو است. | |||
نسبت محیط یک دایره به قطر آن را که با ثابت π مشخص میشود، نشان میدهد. | |||
مبارز. مقدار مطلق یک عدد مشخص را برمیگرداند. | |||
زاویهای را بازمیگرداند که کسینوس آن برابر با عدد مشخصشده است. | |||
زاویهای را بازمیگرداند که سینوس آن عدد مشخصشده است. | |||
زاویهای را بازمیگرداند که تانژانت آن برابر با عدد مشخصشده است. | |||
زاویهای را بازمیگرداند که تانژانت آن حاصلتقسیم دو عدد مشخص است. | |||
محصول انتگرال دو عدد ۳۲ بیتی را تولید میکند. | |||
کوچکترین عدد صحیح بزرگتر یا مساوی با عدد مشخصشده را برمیگرداند. | |||
کسینوس زاویه مشخص را برمیگرداند. | |||
توابع کسینوس هذلولوی زاویه مشخص را برمیگرداند. | |||
دارای چندپادمان. حاصل تقسیم دو عدد را برمیگرداند و باقیمانده را بهعنوان یک پارامتر خروجی ارسال میکند. | |||
مقدار e را به توان مشخصشده برمیگرداند. | |||
بزرگترین عدد صحیح کوچکتر یا مساوی با عدد مشخصشده را برمیگرداند. | |||
باقیمانده تقسیم یک عدد بر عدد دیگر را برمیگرداند. | |||
دارای چندبار بارگذاری. لگاریتم عدد مشخص را برمیگرداند. | |||
مقدار لگاریتم مبنای ده یک عدد مشخص را برمیگرداند. | |||
چندریختی. بزرگتر از دو عدد مشخص را برمیگرداند. | |||
بیشبارگذاری شده. کوچکتر از دو عدد را برمیگرداند. | |||
مقدار عدد مشخص را به توان مشخص برمیگرداند. | |||
دارای بار اضافی. عددی را که به مقدار مشخصشده نزدیکتر است بازمیگرداند. | |||
دارای بار اضافی. مقداری را بازمیگرداند که نشاندهنده علامت یک عدد است. | |||
سینوس زاویه مشخص را برمیگرداند. | |||
سینوس هیپربولیک زاویه مشخص را برمیگرداند. | |||
ریشه دوم یک عدد مشخص را برمیگرداند. | |||
تنگنس زاویه مشخص را برمیگرداند. | |||
تنگنس هیپربولیک زاویه مشخص را برمیگرداند. | |||
وقتی گفته میشود یک تابع «بارگذاری شده» (overloaded) است، یعنی برای انواع مختلف پارامترها وجود دارد. برای مثال، تابع Abs(x) برای x از نوع Integer، Long، Decimal، Single و Float وجود دارد. برای هر یک از این انواع، تعریف جداگانهای از تابع Abs وجود دارد. در این صورت گفته میشود که بارگذاری شده است.
2.3.5.3. اولویتها در ارزیابی عبارتهای عددی
ترتیب اولویت عملگرها هنگام ارزیابی یک عبارت عددی به شرح زیر است (از بالاترین به پایینترین):
دستهبندی | عملگرها |
تمام عبارتها بدون عملگر: توابع، پرانتزها | |
^ | |
+, - | |
*, / | |
\ | |
مد | |
+, - |
2.3.5.4. بیانهای رابطهای
عملگرها به شرح زیر هستند:
=، <>، <، >، <=، >=، 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
و نتیجه اجرای آن:
فرض کنید دو کاراکتر C1 و C2 وجود داشته باشند. میتوان آنها را با استفاده از عملگرهای <، <=، =، <>، > و >= مقایسه کرد. این مقادیر یونیکد آنها – که عدد هستند – هستند که با هم مقایسه میشوند. طبق ترتیب یونیکد، روابط زیر برقرار است:
فاصله < .. < '0' < '1' < .. < '9' < .. < 'A' < 'B' < .. < 'Z' < .. < 'a' < 'b' < .. < 'z'
رشتهها کاراکتر به کاراکتر با هم مقایسه میشوند. اولین نابرابری که بین دو کاراکتر یافت شود، منجر به نابرابری با همان علامت برای رشتهها میشود. با این توضیحات، از خواننده دعوت میشود تا نتایج برنامه قبلی را بررسی کند.
2.3.5.5. بیانهای بولی
عملگرها به شرح زیر هستند:
Not، And، Or، Xor، AndAlso، OrElse |
Not: و منطقی، Or: یا منطقی، Not: نفی، Xor: یا انحصاری.
op1 AndAlso op2: اگر op1 درست باشد، op2 ارزیابی نمیشود و نتیجه درست است.
op1 OrElse op2: اگر op1 درست باشد، op2 ارزیابی نمیشود و نتیجه درست است.
اولویت این عملگرها نسبت به یکدیگر به شرح زیر است:
نه | |
و، AndAlso | |
یا، OrElse | |
XOR |
نتیجه یک عبارت بولی یک مقدار بولی است.
2.3.5.6. عملیات بیتبیتی
از یک سو، همان عملگرهای موجود در حساب بولی را با همان اولویت مییابیم. همچنین دو عملگر جابجایی << و >> وجود دارند. فرض کنید i و j دو عدد صحیح باشند.
i را به اندازه n بیت به سمت چپ جابجا میکند. بیتهایی که وارد میشوند صفر هستند. | |
i را n بیت به سمت راست جابجا میکند. اگر i یک عدد صحیح علامتدار (signed char, int, long) باشد، بیت علامت حفظ میشود. | |
عملیات AND منطقی بیت به بیت i و j را انجام میدهد. | |
یک عملیات منطقی OR بیت به بیت بین i و j را انجام میدهد (OU). | |
i را روی 1 تنظیم کنید | |
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
هنگام اجرا، نتایج زیر را تولید میکند:
2.3.5.7. عملگر مرتبط با تخصیص
میتوان a+=b را نوشت که به معنای a=a+b است. فهرست عملگرهایی که میتوان با عملگر تخصیص ترکیب کرد به شرح زیر است:
^=، *=، /=، \=، +=، -=، &= |
2.3.5.8. اولویتبندی کلی عملگرها
دستهبندی | عملگرها |
تمام عبارتها بدون عملگر | |
^ | |
+, - | |
*, / | |
\ | |
مد | |
+, - | |
و | |
<<, >> | |
=, <>, <, >, <=, >=, Like, Is, TypeOf...Is | |
نه | |
و، AndAlso | |
یا، OrElse | |
XOR |
وقتی یک عملوند بین دو عملگر با اولویت یکسان قرار میگیرد، همنسبتی عملگرها ترتیب انجام عملیات را تعیین میکند. همه عملگرها از سمت چپ به راست اولویتبندی میشوند، به این معنی که عملیات از سمت چپ به راست انجام میگیرند. اولویت و همنسبتی را میتوان با استفاده از عبارتهای داخل پرانتز کنترل کرد.
2.3.5.9. تبدیل انواع
تعداد زیادی تابع از پیش تعریفشده وجود دارد که به شما امکان میدهند از یک نوع داده به نوع دیگر تبدیل کنید. این توابع در زیر فهرست شدهاند:
این توابع به عنوان آرگومان، یا یک عبارت عددی یا یک رشته را میپذیرند. نوع نتیجه در جدول زیر نشان داده شده است:
تابع | نتیجه | محدوده مقادیر برای پارامتر تابع |
منطقی | هر عبارت رشتهای یا عددی معتبر. | |
بایت | 0 تا 255؛ کسریها گرد میشوند. | |
کاراکتر | هر عبارت رشتهای معتبر؛ مقدار باید بین 0 و 65,535 باشد. | |
تاریخ | هر نمایش معتبر از تاریخ و زمان. | |
دوبل | -1,79769313486231E+308 تا -4,94065645841247E-324 برای مقادیر منفی؛ 4,94065645841247E-324 تا 1,79769313486231E+308 برای مقادیر مثبت. | |
ممیز | +/-79,228,162,514,264,337,593,543,950,335 برای اعداد بدون اعشار. بازه مقادیر برای اعداد با 28 رقم اعشاری است +/-7.9228162514264337593543950335. کوچکترین عدد غیرصفر 0.0000000000000000000000000001 است. | |
صدم | از -۲٬۱۴۷٬۴۸۳٬۶۴۸ تا ۲٬۱۴۷٬۴۸۳٬۶۴۷؛ کسریها گرد میشوند. | |
طولانی | از -۹٬۲۲۳٬۳۷۲٬۰۳۶٬۸۵۴٬۷۷۵٬۸۰۸ تا ۹٬۲۲۳٬۳۷۲٬۰۳۶٬۸۵۴٬۷۷۵٬۸۰۷؛ کسریها گرد شدهاند. | |
| شیء | هر عبارت معتبر. |
کوتاه | -۳۲٬۷۶۸ تا ۳۲٬۷۶۷؛ کسریها گرد میشوند. | |
تکی | -3,402823E+38 تا -1,401298E-45 برای مقادیر منفی؛ 1,401298E-45 تا 3,402823E+38 برای مقادیر مثبت. | |
رشته | مقادیر بازگشتی تابع 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 را در خود نگه میدارد.
اجرای برنامه را با مقدار وضعیت 0 خاتمه میدهد.
2.4.2. ساختار تصمیمگیری ساده
- هر اقدام در یک خط جداگانه قرار دارد
- بند 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
نتیجهٔ بهدستآمده:
2.4.3. ساختار مورد
سینتکس به شرح زیر است:
select case expression
case liste_valeurs1
actions1
case liste_valeurs2
actions2
...
case else
actions_sinon
end select
- نوع [expression] باید یکی از انواع زیر باشد:
- بند [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
این برنامه نتایج زیر را تولید میکند:
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
نتایج:
یک ساختار تکرار دیگر با تعداد تکرارهای معلوم به صورت زیر است:
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
نمایش داده میشود:
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
2.4.4.3. دستورالعملهای مدیریت حلقه
خروج از حلقه do...loop | |
خروج از حلقه 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] هرگونه تبدیل نوع دادهای را که منجر به از دست رفتن دادهها شود و همچنین هرگونه تبدیل بین انواع عددی و رشتهای ممنوع میکند. بنابراین باید از توابع تبدیل بهطور صریح استفاده شود.
- برنامه تمام نامفضههایی را که نیاز دارد وارد میکند. ما هنوز این مفهوم را معرفی نکردهایم. در برنامههای قبلی، اغلب با دستورات مشابهی مواجه شدهایم:
در واقع باید مینوشتیم:
که در آن 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 اجرا شود:
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، به دنبال اولین سطری میگردیم که QF ≤ field1 باشد. برای مثال، اگر QF = 23000 باشد، سطر را پیدا خواهیم کرد
مالیات I در این صورت برابر است با 0.15*R - 2072.5*nbParts. اگر QF به گونهای باشد که شرط QF <= field1 هرگز برقرار نشود، ضرایب مربوط به آخرین خط استفاده میشوند. در این صورت:
که مالیات 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 arg1 … argn و اگر رویه 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
اجرا نتایج زیر را تولید میکند:
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
نتایج اجرا به شرح زیر است:
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 : 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
نتایج بهدستآمده به شرح زیر است:
مقدار ۲۰ پارامتر واقعی به پارامتر صوری 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
و نتایج اجرا:
پارامتر واقعی برای انعکاس تغییر در پارامتر صوری بهروزرسانی شده است. این روش ارسال برای پارامترهای خروجی یک تابع مناسب است.

