Skip to content

2. VB.NET dilinin temelleri

2.1. Giriş

VB.NET'i öncelikle klasik bir programlama dili olarak ele alacağız. Nesnelere daha sonra değineceğiz.

Bir programda iki şey bulunur

  • veriler
  • bu verileri işleyen komutlar

Genellikle verileri komutlardan ayırmaya çalışırız:

2.2. VB.NET verileri

VB.NET şu veri türlerini kullanır:

  1. tamsayılar, gerçek sayılar ve ondalık sayılar
  1. karakterler ve karakter dizileri
  2. boole değerleri
  3. tarihler
  4. nesneler

2.2.1. Önceden tanımlanmış veri türleri

VB türü
Eşdeğer .NET türü
Boyut
Değer aralığı
Boolean
System.Boolean
2 bayt
True veya False.
Byte
System.Byte
1 bayt
0 ile 255 arası (işaretsiz).
Karakter
System.Char
2 bayt
0 ile 65.535 arası (işaretsiz).
Tarih
System.DateTime
8 bayt
1 Ocak 0001 saat 00:00:00 ile 31 Aralık 9999 saat 23:59:59 arası.
Ondalık
System.Decimal
16 bayt
0 ile +/-79 228 162 514 264 337 593 543 950 335 arasında (ondalık basamak yok); 0 ile +/-7,9228162514264337593543950335 arasında (28 ondalık basamaklı); sıfırdan farklı en küçük sayı +/-0,0000000000000000000000000001 (+/-1E-28) 'dir.
Çift
System.Double
8 bayt
-1,79769313486231E+308 ile
-4,94065645841247E-324; pozitif değerler için ise 4,94065645841247E-324 ile 1,79769313486231E+308 arasındadır.
Tamsayı
System.Int32
4 bayt
-2 147 483 648 ile 2 147 483 647 arası.
Uzun
System.Int64
8 bayt
-9 223 372 036 854 775 808 ile 9 223 372 036 854 775 807 arası.
Nesne
System.Object
4 bayt
Object türündeki bir değişkene herhangi bir tür depolanabilir.
Short
System.Int16
2 bayt
-32.768 ile 32.767 arası.
Single
System.Single
4 bayt
-3,402823E+38 ile -1,401298E-45 arası negatif değerler için; 1,401298E-45 ile 3,402823E+38 arası pozitif değerler için.
Dize
System.String (sınıf)
 
0'dan yaklaşık 2 milyar Unicode karakterine kadar.

Yukarıdaki tabloda, 32 bitlik bir tamsayı için iki olası tür olduğu görülmektedir: Integer ve System.Int32. Bu iki tür birbirinin yerine kullanılabilir. Aynı durum, diğer türler olan VB ve .NET platformundaki eşdeğerleri için de geçerlidir. İşte bir program örneği:


Module types
    Sub Main()
        ' tamsayılar
        Dim var1 As Integer = 100
        Dim var2 As Long = 10000000000L
        Dim var3 As Byte = 100
        Dim var4 As Short = 4
        ' gerçek sayılar
        Dim var5 As Decimal = 4.56789D
        Dim var6 As Double = 3.4
        Dim var7 As Single = -0.000103F
        ' tarih
        Dim var8 As Date = New Date(2003, 1, 1, 12, 8, 4)
        ' boole
        Dim var9 As Boolean = True
        ' karakter
        Dim var10 As Char = "A"c
        ' karakter dizisi
        Dim var11 As String = "abcde"
        ' nesne
        Dim var12 As Object = New Object
        ' görüntülemeler
        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

Çalıştırıldığında şu sonuçlar elde edilir:

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. Sabit verilerin notasyonu

Integer
145, -7, &FF (onaltılık)
Long
100000L
Double
134,789, -45E-18 (-45 × 10⁻¹⁸)
Single
134.789F, -45E-18F (-45 10-18)
Decimal
100000D
Char
"A"c
String
"bugün"
Boolean
true, false
date
01/01/2003 için New Date(2003, 1, 1)

Aşağıdaki noktalara dikkat edilmelidir:

  • 100000L, L harfi sayının uzun tamsayı olarak kabul edildiğini belirtir
  • 134.789F, F harfi sayının tek hassasiyetli bir gerçek sayı olarak kabul edildiğini belirtir
  • 100000D, D harfi sayının ondalık gerçek sayı olarak kabul edildiğini belirtir
  • "A"c, "A" karakter dizisini 'A' karakterine dönüştürmek için
  • Dize, " karakteriyle çevrelenmiştir. Dize " karakterini içermesi gerekiyorsa, [abcd"e] dizesini temsil etmek için bu karakter "abcd""e" örneğinde olduğu gibi iki kez kullanılır.

2.2.3. Veri Bildirimi

2.2.3.1. Bildirimlerin rolü

Bir program, bir ad ve bir tür ile tanımlanan verileri işler. Bu veriler bellekte depolanır. Programın derlenmesi sırasında, derleyici her veriye bir adres ve bir boyut ile tanımlanan bir bellek konumu atar. Bunu, programcı tarafından yapılan tanımlamalardan yararlanarak yapar. Ayrıca bu bildirimler, derleyicinin programlama hatalarını tespit etmesini sağlar. Örneğin, x bir karakter dizisiyse x=x*2 işlemi hatalı olarak bildirilir.

2.2.3.2. Sabitlerin Bildirilmesi

Bir sabitin tanımlama sözdizimi şöyledir:

const tanımlayıcı as tür=değer

örneğin [const PI as double=3.141592]. Neden sabitler tanımlanır?

  1. Sabitlere anlamlı bir isim verilirse programın okunması daha kolay olur: [const taux_tva as single=0.186F]
  2. "Sabit" değişirse, programı değiştirmek daha kolay olacaktır. Dolayısıyla önceki örnekte, KDV oranı %33'e çıkarsa, yapılması gereken tek değişiklik, değerini tanımlayan komutu değiştirmek olacaktır: [const taux_tva as single=0.336F]. Programda 0,186 değeri açıkça kullanılmış olsaydı, o zaman değiştirilmesi gereken çok sayıda komut olurdu.

2.2.3.3. Değişkenlerin tanımlanması

Bir değişken bir adla tanımlanır ve bir veri türüne aittir. VB.NET, büyük ve küçük harf ayrımı yapmaz. Dolayısıyla, FIN ve fin değişkenleri aynıdır. Değişkenler, tanımlandıkları sırada başlatılabilir. Bir veya daha fazla değişkenin tanımlanma sözdizimi şöyledir:

dim değişken1, değişken2, ..., değişkenn as tür_tanımlayıcısı

burada identificateur_de_type, önceden tanımlanmış bir tür veya programcı tarafından tanımlanmış bir türdür.

2.2.4. Sayılar ve karakter dizeleri arasındaki dönüştürmeler

nombre -> chaîne
nombre.ToString veya "" & sayı veya CType(sayı,String)
objet -> chaîne
objet.ToString
chaine -> Integer
Integer.Parse(dize) veya Int32.Parse
chaîne -> Long
Long.Parse (dizi) veya Int64.Parse
chaîne -> Double
Double.Parse (dizi)
chaîne -> Single
Single.Parse (dize)

Dize geçerli bir sayı değilse, dizenin sayıya dönüştürülmesi başarısız olabilir. Bu durumda, VB.NET adlı bir ölümcül hata (istisna) oluşur. Bu hata, aşağıdaki try/catch cümlesiyle yönetilebilir:

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

İşlev bir istisna oluşturmazsa, bir sonraki komuta geçilir; aksi takdirde catch cümlesinin gövdesine geçilir ve ardından bir sonraki komuta geçilir. İstisna yönetimine daha sonra tekrar değineceğiz. Aşağıda, sayılar ve karakter dizeleri arasında dönüştürme için kullanılan başlıca teknikleri gösteren bir program yer almaktadır. Bu örnekte işlev, parametresinin değerini ekrana yazdırır. Dolayısıyla affiche(S), S'nin değerini ekrana yazdırır.


' yönergeler
Option Strict On

' ithal edilen ad alanları
Imports System

' test modülü
Module Module1

    Sub Main()
        ' ana prosedür
        ' yerel veriler
        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

        ' sayı --> dize
        affiche(CType(i, String))
        affiche(CType(l, String))
        affiche(CType(f, String))
        affiche(CType(d, String))

        'boolean --> dize
        Const b As Boolean = False
        affiche(b.ToString)

        ' dize --> int
        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

        ' dize --> 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

        ' dize --> 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

        ' dize --> 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

    ' görüntüle
    Public Sub affiche(ByVal S As String)
        Console.Out.WriteLine("S=" + S)
    End Sub
End Module

Elde edilen sonuçlar şunlardır:

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.

Dize biçimindeki gerçek sayılarda ondalık nokta yerine virgül kullanılması gerektiğine dikkat edilmelidir. Dolayısıyla şöyle yazılır: Dim d As Double = -14.98 ancak Dim d1 As Double = Double.Parse("100,87")

2.2.5. Veri tabloları

VB.NET dizisi, aynı türdeki verileri tek bir tanımlayıcı altında bir araya getirmek için kullanılan bir nesnedir. Bildirimi şu şekildedir:

Dim Dizi(n) as type veya Dim Dizi() as type = New type(n) {}

burada n, dizinin son elemanının indeksidir. Tableau(i) sözdizimi, i'nin [0,n] aralığına ait olduğu i numaralı veriyi belirtir. Tableau(i) verisine yapılan herhangi bir atıfta, i'in [0,n] aralığına ait olmaması durumunda bir istisna oluşur. Bir dizi, tanımlandığı anda aynı zamanda başlatılabilir. Bu durumda, son elemanın numarasını belirtmeye gerek yoktur.


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

Dizilerin, dizideki eleman sayısını gösteren Length özelliği vardır. İşte bir örnek program:


Module tab0
    Sub Main()
        ' birinci tablo
        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

        ' ikinci tablo
        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

ve programın çalıştırılması:

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

İki boyutlu bir dizi şu şekilde tanımlanabilir:

Dim Dizi(n,m) as Type veya Dim Dizi(,) as Type=New Type(n,m) {}

burada n+1 satır sayısı, m+1 ise sütun sayısıdır. Tableau(i,j) sözdizimi, Tableau'nun i satırındaki j öğesini belirtir. İki boyutlu dizi de tanımlandığı sırada aynı anda başlatılabilir:


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

Her bir boyuttaki eleman sayısı, GetLenth(i) yöntemi ile elde edilebilir; burada i=0, 1. indekse karşılık gelen boyutu, i=1 ise 2. indekse karşılık gelen boyutu temsil eder, …İşte bir örnek program:


Module Module2
    Sub Main()
        ' birinci tablo
        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

        ' ikinci tablo
        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

ve programın çalıştırılmasının sonuçları:

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

Bir dizi dizisi şu şekilde tanımlanır:

Dim Dizi(n)() as Type veya Dim Dizi()() as Type = new Type(n)()

Yukarıdaki tanım, n+1 satırlık bir dizi oluşturur. Her bir Tableau(i) elemanı, tek boyutlu bir dizi referansıdır. Bu diziler, yukarıdaki tanım sırasında oluşturulmaz. Aşağıdaki örnek, bir dizi dizisinin oluşturulmasını göstermektedir:


         ' tabloların bir tablosu
        Dim noms()() As String = New String(3)() {}
         ' başlatma
        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

Burada noms(i), i+1 elemanlı bir dizidir. noms(i) bir dizi olduğu için, noms(i).Length onun eleman sayısıdır. İşte az önce tanıttığımız üç dizi türünü bir araya getiren bir örnek:


' yönergeler
Option Strict On
Option Explicit On 

' ithalatlar
Imports System

' test sınıfı
Module test
    Sub main()
        ' başlatılmış 1 boyutlu bir dizi
        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

        ' başlatılmış 2 boyutlu bir dizi
        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

        ' diziler dizisi
        Dim noms()() As String = New String(3)() {}

        ' başlatma
        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

        ' görüntüleme
        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

Çalıştırıldığında şu sonuçları elde ederiz:

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 için temel talimatlar

Aşağıdaki ayrım yapılır

1 bilgisayar tarafından yürütülen temel komutlar.

2 programın akışını kontrol eden komutlar.

Bir mikrobilgisayarın ve çevre birimlerinin yapısı incelendiğinde temel komutlar açıkça görülür.

  1. klavyeden gelen bilgilerin okunması

  2. bilgilerin işlenmesi

  3. Bilgilerin ekrana yazılması

  4. disk dosyasından bilgi okuma

  5. Bilgilerin bir disk dosyasına yazılması

2.3.1. Ekrana yazma

Ekrana yazma için çeşitli komutlar mevcuttur:

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

burada expression, ekranda görüntülenmek üzere karakter dizisine dönüştürülebilen herhangi bir veri türüdür. Şimdiye kadar gördüğümüz örneklerde, yalnızca Console.Out.WriteLine(ifade) komutunu kullandık.

System.Console sınıfı, ekrana yazma işlemlerine (Write, WriteLine) erişim sağlar. Console sınıfı, StreamWriter türünde yazma akışları olan Out ve Error adlı iki özelliğe sahiptir:

  • Console.WriteLine() işlevi, Console.Out.WriteLine() işlevine eşdeğerdir ve genellikle ekrana bağlı olan Out akışına yazma işlemi gerçekleştirir.
  • Console.Error.WriteLine() işlevi, genellikle yine ekrana atanan Error akışına yazma işlemi gerçekleştirir.

Out ve Error akışları varsayılan olarak ekrana yönlendirilir. Ancak, birazdan göreceğimiz gibi, programın çalıştırılması sırasında bu akışlar metin dosyalarına yönlendirilebilir.

2.3.2. Klavyeyle girilen verilerin okunması

Klavye kaynaklı veri akışı, StreamReader türündeki Console.In nesnesi ile belirtilir. Bu tür nesneler, ReadLine yöntemi ile bir metin satırını okumaya olanak tanır:


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

Klavyeyle girilen satır, ligne değişkenine kaydedilir ve daha sonra programme.Le tarafından işlenebilir. In akışı, Out ve Error akışları gibi bir dosyaya yönlendirilebilir.

2.3.3. Giriş-Çıkış Örneği

Aşağıda, klavye/ekran giriş-çıkış işlemlerini gösteren kısa bir program yer almaktadır:


' seçenekler
Option Explicit On 
Option Strict On

' ad alanları
Imports System

' modül
Module io1
    Sub Main()
        ' Out akışına yazma
        Dim obj As New Object
        Console.Out.WriteLine(("" & obj.ToString))

        ' Hata akışına yazma
        Dim i As Integer = 10
        Console.Error.WriteLine(("i=" & i))

        ' klavyeden girilen bir satırı okuma
        Console.Out.Write("Tapez une ligne : ")
        Dim ligne As String = Console.In.ReadLine()
        Console.Out.WriteLine(("ligne=" + ligne))
    End Sub
End Module

ve çalıştırma sonuçları:

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

Talimatlar


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

sadece herhangi bir nesnenin görüntülenebileceğini göstermek amacıyla verilmiştir. Burada görüntülenenlerin anlamını açıklamaya çalışmayacağız.

2.3.4. G/Ç Yönlendirme

DOS/Windows altında şu üç standart aygıt bulunmaktadır:

  1. standart giriş aygıtı - varsayılan olarak klavyeyi ifade eder ve 0 numaralıdır
  2. standart çıkış aygıtı - varsayılan olarak ekranı ifade eder ve 1 numaralıdır
  3. standart hata aygıtı - varsayılan olarak ekranı ifade eder ve 2 numaralıdır

VB.NET'te, Console.Out yazma akışı aygıt 1'e yazar, Console.Error yazma akışı aygıt 2'ye yazar ve Console.In okuma akışı aygıt 0'dan gelen verileri okur. Windows'ta bir DOS penceresinde bir program çalıştırıldığında, yürütülen program için 0, 1 ve 2 numaralı aygıtların hangileri olacağı belirlenebilir. Şu komut satırını ele alalım:

pg arg1 arg2 .. argn

pg programının argi argümanları kullanılarak, standart G/Ç aygıtlarını dosyalara yönlendirmek mümkündür:

0<in.txt
0 numaralı standart giriş akışı, in.txt dosyasına yönlendirilir. Dolayısıyla programda Console.In akışı, verilerini in.txt dosyasından alacaktır.
 
1>out.txt
1 numaralı çıkışı out.txt dosyasına yönlendirir. Bu, programda Console.Out akışının verilerini out.txt dosyasına yazacağı anlamına gelir
  
1>>out.txt
aynı şekilde, ancak yazılan veriler out.txt dosyasının mevcut içeriğine eklenir.
  
2>error.txt
2 numaralı çıkışı error.txt dosyasına yönlendirir. Bu, programda Console.Error akışının verilerini error.txt dosyasına yazacağı anlamına gelir
  
2>>error.txt
aynı şekilde, ancak yazılan veriler error.txt dosyasının mevcut içeriğine eklenir.
  
1>out.txt 2>error.txt
1 ve 2 numaralı aygıtların her ikisi de dosyalara yönlendirilir
  

pg programının G/Ç akışlarını dosyalara yönlendirmek için pg programının değiştirilmesine gerek olmadığına dikkat edilmelidir. 0, 1 ve 2 numaralı aygıtların türünü belirleyen program OS'tir. Aşağıdaki programı ele alalım:


' seçenekler
Option Explicit On 
Option Strict On

' ad alanları
Imports System

' yönlendirmeler
Module console2
    Sub Main()
        ' In akışını okuma
        Dim data As String = Console.In.ReadLine()
        ' Out akışına yazma
        Console.Out.WriteLine(("écriture dans flux Out : " + data))
        ' Hata akışı yazma
        Console.Error.WriteLine(("écriture dans flux Error : " + data))
    End Sub
End Module

Bu programı derleyelim:

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

İlk çalıştırmayı yapalım:

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

Yukarıdaki çalıştırma, standart In, Out ve Error G/Ç akışlarının hiçbirini yeniden yönlendirmiyor. Şimdi bu üç akışı da yeniden yönlendirelim. In akışı, in.txt dosyasına, Out akışı out.txt dosyasına, Error akışı ise error.txt dosyasına yönlendirilecektir. Bu yönlendirme, komut satırında şu şekilde gerçekleştirilir:

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

komut satırında gerçekleştirilir. Yürütme işlemi şu sonuçları verir:

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 ve Error akışlarının aynı aygıtlara yazmadıkları açıkça görülmektedir.

2.3.5. Bir ifadenin değerinin bir değişkene atanması

Burada variable=expression. işlemiyle ilgileniyoruz. İfade şu türlerden olabilir: aritmetik, ilişkisel, boole, karakter.

2.3.5.1. İşlemcilerin listesi

İşlem
Dil öğesi
Arithmétique
^, –, *, /, \, Mod, +, =
Assignation
=, ^=, *=, /=, \=, +=, -=, &=
Comparaison
=, <>, <, >, <=, >=, Like, Is
Concaténation
&, +
Opérations logiques/de bits
Değil, Ve, Veya, XOR, AndAlso, OrElse
Opérations diverses
AddressOf, GetType

2.3.5.2. Aritmetik ifade

Aritmetik ifadelerin işleçleri şunlardır:

Arithmétique
^, –, *, /, \, Mod, +, =
  • : toplama, - : çıkarma, * : çarpma, / : gerçek bölme, \ : tam sayı bölme sonucu, Mod : tam sayı bölme kalanı, ^: üs alma. Dolayısıyla aşağıdaki program:

' aritmetik operatörler
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

şu sonuçları verir:

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

Çeşitli matematiksel fonksiyonlar vardır. İşte bunlardan bazıları:


Public Shared Function Sqrt(ByVal d As Double ) As Double
kare kökü

[Visual Basic]
Public Shared Function Cos(ByVal d As Double ) As Double
kosinüs

Public Shared Function Sin(ByVal a As Double) As Double
Sinüs

[Visual Basic]
Public Shared Function Tan(ByVal a As Double) As Double
Tanjant

[Visual Basic]
Public Shared Function Pow(ByVal x As Double,ByVal y As Double) As Double
x'in y'inci kuvveti (x>0)

[Visual Basic]
Public Shared Function Exp(ByVal d As Double) As Double
Üstel

[Visual Basic]
Overloads Public Shared Function Log( ByVal d As Double ) As Double
Neper logaritması

Overloads Public Shared Function Abs(ByVal value As Double ) As Double
mutlak değer
....
 

Tüm bu fonksiyonlar, Math adlı bir sınıfta tanımlanmıştır. Bunları kullanırken, tanımlandıkları sınıfın adını ön ek olarak eklemek gerekir. Dolayısıyla şöyle yazılır:

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

Math sınıfının tam tanımı şöyledir:

E 
e sabiti ile belirtilen doğal logaritma tabanını temsil eder.
  
PI 
Bir dairenin çevresinin çapına oranını temsil eder; bu oran π sabiti ile belirtilir.
  
Abs 
Aşırı yüklenmiştir. Belirtilen bir sayının mutlak değerini döndürür.
 
Acos 
Belirtilen sayının kosinüsüne karşılık gelen açıyı döndürür.
 
Asin 
Sinüsü belirtilen sayı olan açıyı döndürür.
 
Atan 
Tanjantı belirtilen sayı olan açıyı döndürür.
 
Atan2 
Tanjantı, belirtilen iki sayının bölünmesiyle elde edilen sayı olan açıyı döndürür.
 
BigMul
İki 32 bit sayının tam çarpımını oluşturur.
 
Ceiling 
Belirtilen sayıya eşit veya ondan büyük olan en küçük tamsayıyı döndürür.
 
Cos 
Belirtilen açının kosinüsünü döndürür.
 
Cosh 
Belirtilen açının hiperbolik kosinüsünü döndürür.
 
DivRem
Üstüne yazılmıştır. İki sayının bölümünü döndürür ve kalanı çıktı parametresi olarak geçirir.
 
Exp 
e'nin belirtilen üssüne yükseltilmiş değerini döndürür.
 
Floor 
Belirtilen sayıya eşit veya ondan küçük en büyük tamsayıyı döndürür.
 
IEEERemainder 
Belirtilen bir sayının başka bir sayıya bölünmesinden kalan değeri döndürür.
 
Log 
Üstü yazılmıştır. Belirtilen sayının logaritmasını döndürür.
 
Log10 
Belirtilen sayının 10 tabanında logaritmasını döndürür.
 
Max 
Üstüne yazılmıştır. Belirtilen iki sayıdan büyük olanını döndürür.
 
Min 
Aşırı yüklenmiş. İki sayıdan daha küçük olanını döndürür.
 
Pow 
Belirtilen sayıyı belirtilen üssün kuvvetine yükseltir.
 
Round 
Üstüne yazılmıştır. Belirtilen değere en yakın sayıyı döndürür.
 
Sign 
Üstüne yazılmıştır. Bir sayının işaretini belirten bir değer döndürür.
 
Sin 
Belirtilen açının sinüsünü döndürür.
 
Sinh 
Belirtilen açının hiperbolik sinüsünü döndürür.
 
Sqrt 
Belirtilen sayının karekökünü döndürür.
 
Tan 
Belirtilen açının tanjantını döndürür.
 
Tanh 
Belirtilen açının hiperbolik tanjantını döndürür.
 

Bir fonksiyon "aşırı yüklenmiş" olarak tanımlandığında, bu fonksiyonun çeşitli parametre türleri için mevcut olduğu anlamına gelir. Örneğin, Abs(x) fonksiyonu x'in Integer, Long, Decimal, Single, Float türleri için mevcuttur. Bu türlerin her biri için Abs fonksiyonunun ayrı bir tanımı vardır. Bu durumda fonksiyonun aşırı yüklenmiş olduğu söylenir.

2.3.5.3. Aritmetik ifadelerin değerlendirilmesinde öncelikler

Bir aritmetik ifadenin değerlendirilmesi sırasında operatörlerin önceliği şu şekildedir (en yüksek öncelikli olandan en düşük öncelikli olana doğru):

Kategori
İşlemciler
Primaire
İşlemci içermeyen tüm ifadeler: fonksiyonlar, parantezler
Élévation à la puissance
^
Négation unaire
+, -
Multiplication
*, /
Division par un entier
\
Modulo
Mod
Addition
+, -

2.3.5.4. İlişkisel ifadeler

İşlemciler şunlardır:

Comparaison
=, <>, <, >, <=, >=, Like, Is

= : eşittir, <> : farklıdır, < : (kesinlikle) daha küçüktür, > : (kesinlikle) daha büyüktür, <= : küçük veya eşittir, >= : büyük veya eşittir, Like : bir şablona uyar, Is : nesnelerin özdeşliği. Tüm bu operatörlerin önceliği aynıdır. Soldan sağa doğru değerlendirilirler. Bir ilişkisel ifadenin sonucu bir Boole değeridir.

Dize karşılaştırması: Aşağıdaki programı ele alalım:


' ad alanları
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

ve çalıştırıldığında elde edilen sonuç:

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

C1 ve C2 olmak üzere iki karakter varsayalım. Bunları <, <=, =, <>, >, >= operatörleriyle karşılaştırmak mümkündür. Bu durumda, karakterlerin sayılar olan Unicode değerleri karşılaştırılır. Unicode sıralamasına göre aşağıdaki ilişkiler geçerlidir:

boşluk < .. < '0' < '1' < .. < '9' < .. < 'A' < 'B' < .. < 'Z' < .. < 'a' < 'b' < .. < 'z'

Dizgiler karakter karakter karşılaştırılır. İki karakter arasında karşılaşılan ilk eşitsizlik, dizgiler üzerinde de aynı yönde bir eşitsizliğe yol açar. Bu açıklamalar ışığında, okuyucunun önceki programın sonuçlarını incelemesi önerilir.

2.3.5.5. Boole ifadeleri

İşlemciler şunlardır:

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

Not: mantıksal ve, Or: mantıksal veya, Not: olumsuzlama, Xor: dışlayıcı veya.

op1 AndAlso op2: op1 yanlışsa, op2 değerlendirilmez ve sonuç yanlış olur.

op1 OrElse op2: op1 doğruysa, op2 değerlendirilmez ve sonuç doğrudur.

Bu operatörlerin birbirleri arasındaki öncelik sırası şöyledir:

NOT logique
Not
AND logique
Ve, AndAlso
OR logique
Ve, OrElse
XOR logique
XOR

Bir Boole ifadesinin sonucu bir Boole değeridir.

2.3.5.6. Bit İşlemleri

Bir yandan, aynı önceliğe sahip Boole operatörleriyle aynı operatörler bulunur. Ayrıca iki kaydırma operatörü de vardır: << ve >>. i ve j iki tamsayı olsun.

i<<n
i'yi n bit sola kaydırır. Gelen bitler sıfırdır.
i>>n
i'yi n bit sağa kaydırır. i işaretli bir tamsayıysa (signed char, int, long), işaret biti korunur.
i & j
i ve j'nin bit bazında mantıksal OR işlemini gerçekleştirir.
i | j
i ve j'nin bit bazında mantıksal OR işlemini gerçekleştirir.
~i
i'yi 1'e tamamla
i^j
i ve j için OU EXCLUSIF'i oluşturur

Şu programı ele alalım:


Module operationsbit
    Sub main()
        ' bit işlemleri
        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

Programın çalıştırılması şu sonuçları verir:

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

2.3.5.7. Atama işlemiyle birleştirilebilen operatörler

a+=b şeklinde yazılabilir; bu, a=a+b anlamına gelir. Atama işlemiyle birleştirilebilen operatörlerin listesi şöyledir:

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

2.3.5.8. Operatörlerin genel önceliği

Kategori
İşlemciler
Primaire
İşlemci içermeyen tüm ifadeler
Élévation à la puissance
^
Négation unaire
+, -
Multiplication
*, /
Division par un entier
\
Modulo
Mod
Addition
+, -
Concaténation
&
Déplacement
<<, >>
Relationnel
=, <>, <, >, <=, >=, Like, Is, TypeOf...Is
NOT logique
Değil
AND logique
Ve, AndAlso
OR logique
Ve, OrElse
XOR logique
XOR

Bir işleneni, aynı önceliğe sahip iki işleç arasına yerleştirildiğinde, işlemlerin gerçekleştirilme sırasını işleçlerin birleşim kuralı belirler. Tüm işleçler soldan birleşimlidir; bu, işlemlerin soldan sağa doğru gerçekleştirileceği anlamına gelir. Öncelik ve birleşim kuralı, parantez içindeki ifadeler kullanılarak kontrol edilebilir.

2.3.5.9. Tür Dönüştürmeleri

Bir veri türünden diğerine geçiş yapmayı sağlayan bir dizi önceden tanımlanmış işlev vardır. Bunların listesi şöyledir:

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

Bu işlevler, argüman olarak sayısal bir ifade veya bir karakter dizesi kabul eder. Sonucun türü aşağıdaki tabloda belirtilmiştir:

fonksiyon
sonuç
İşlev parametresinin değer aralığı
CBool
Boolean
Herhangi bir geçerli dize veya sayısal ifade.
CByte
Bayt
0 ile 255 arası; kesirler yuvarlanır.
CChar
Karakter
Herhangi bir geçerli String ifadesi; değer 0 ile 65.535 arasında olabilir.
CDate
Tarih
Tarih ve saatin herhangi bir geçerli gösterimi.
CDbl
Double
-1,79769313486231E+308 ile
-4,94065645841247E-324 arasında (negatif değerler için); 4,94065645841247E-324 ile 1,79769313486231E+308 arasında (pozitif değerler için).
CDec
Ondalık
+/-79 228 162 514 264 337 593 543 950 335, ondalık basamağı olmayan sayılar için. 28 ondalık basamaklı sayıların değer aralığı
+/-7,9228162514264337593543950335'tir. Sıfırdan farklı en küçük sayı 0,0000000000000000000000000001'dir.
CInt
Tamsayı
-2 147 483 648 ile 2 147 483 647 arasındadır; kesirler yuvarlanır.
CLng
Uzun
-9 223 372 036 854 775 808 ile 9 223 372 036 854 775 807 arası; kesirler yuvarlanır.

CObj 
Nesne
Herhangi bir geçerli ifade.
CShort
Kısa
-32 768 ile 32 767 arası; kesirler yuvarlanır.
CSng
Tek
-3,402823E+38 ile -1,401298E-45 arası negatif değerler için; 1,401298E-45 ile 3,402823E+38 arası pozitif değerler için.
CStr
String
Cstr işlevi tarafından döndürülen değerler, expression argümanına bağlıdır.

İşte bir örnek program:


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

ve programın çalıştırılmasının sonuçları:

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

Aşağıdaki programda gösterildiği gibi CType(expression, type) işlevini de kullanabiliriz:


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

Bu, aşağıdaki sonuçları verir:

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. Programın işleyişini denetleme talimatları

2.4.1. Durdurma

Environment sınıfında tanımlanan Exit yöntemi, bir programın yürütülmesini durdurmaya yarar:


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

çalışmakta olan işlemi durdurur ve exitCode değerini üst işleme döndürür. exitCode değeri üst işlem tarafından kullanılabilir. DOS durumunda, bu durum değişkeni, DOS olarak ERRORLEVEL sistem değişkenine aktarılır ve bu değer bir toplu iş dosyasında test edilebilir. Unix'te, exitCode'in değerini alan değişken $?'dir.

    Environment.Exit(0)

programın çalışmasını 0 durum değeriyle durdurur.

2.4.2. Basit seçim yapısı

if condition then
    actions_alors
else
    actions_sinon
end if
  • her eylem ayrı bir satırda yer alır
  • else cümlesi bulunmayabilir.

Aşağıdaki örnekte gösterildiği gibi seçim yapıları iç içe geçirilebilir:


' seçenekler
Option Explicit On 
Option Strict On

' ad alanları
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

Elde edilen sonuç:

10 est > 4

2.4.3. Durum yapısı

Sözdizimi şu şekildedir:

select case expression
    case liste_valeurs1
        actions1
case liste_valeurs2
        actions2
...
case else
        actions_sinon
end select
  • [expression] türü, aşağıdaki türlerden biri olmalıdır:
Boolean, Byte, Char, Date, Decimal, Double, Integer, Long, Object, Short, Single et String
  • [case else] cümlesi bulunmayabilir.
  • [liste_valeursi], ifadenin olası değerleridir. [listes_valeursi], condition1, condition2, ..., conditionx koşullarından oluşan bir listeyi temsil eder. [expression], koşullardan birini doğrularsa, [liste_valeursi] cümlesinin ardındaki eylemler yürütülür. Koşullar şu şekilde olabilir:
  • val1 to val2: [expression], [val1,val2] etki alanına aitse doğrudur
  • val1: [expression], val1'e eşitse doğrudur
  • is > val1: [expression] > val1 ise doğru. [is] anahtar sözcüğü bulunmayabilir
  • =, <, <=, >, >=, <> operatörleri için de durum aynıdır
  • Yalnızca ilk koşulun karşılanmasıyla ilgili eylemler yürütülür.

Aşağıdaki programı ele alalım:


' seçenekler
Option Explicit On 
Option Strict On

' ad alanları
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

Aşağıdaki sonuçları verir:

i est < 15

2.4.4. Tekrar yapısı

2.4.4.1. Tekrar sayısı biliniyor


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

[counter] değişkeninin aldığı her bir değer için işlemler gerçekleştirilir. Aşağıdaki programı ele alalım:


' seçenekler
Option Explicit On 
Option Strict On

' ad alanları
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

Sonuçlar:

somme( 0 2 4 6 8 10)=30

Yineleme sayısı bilinen başka bir yineleme yapısı şöyledir:


For Each element [ As datatype ] In groupe
   [ actions ]
Next [ element ]
  • groupe bir nesne koleksiyonudur. Zaten bildiğimiz nesne koleksiyonu, dizi
  • datatype, koleksiyondaki nesnelerin türüdür. Bir dizi için bu, dizinin elemanlarının türü olurdu
  • element, döngüye özgü bir yerel değişkendir ve koleksiyondaki tüm değerleri sırayla alacaktır.

Dolayısıyla aşağıdaki kod:


' seçenekler
Option Explicit On 
Option Strict On

' ad alanları
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

şunu görüntüler:

paul
hélène
jacques
sylvie

2.4.4.2. Tekrar sayısı bilinmiyor

Bu durum için VB.NET'te birçok yapı bulunmaktadır.


Do { While | Until } condition
   [ statements ]
Loop

Koşul doğru olduğu sürece (while) veya koşul doğru olana kadar (until) döngü devam eder. Döngü hiç yürütülmeyebilir.


Do
   [ statements ]
Loop { While | Until } condition

Koşul doğru olduğu sürece (while) veya koşul doğru olana kadar (until) döngü devam eder. Döngü her zaman en az bir kez yürütülür.


While condition
   [ statements ]
End While

Koşul doğru olduğu sürece döngü devam eder. Döngü hiç yürütülmeyebilir. Aşağıdaki döngülerin tümü, ilk 10 tam sayının toplamını hesaplar.


' seçenekler
Option Explicit On 
Option Strict On

' ad alanları
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. Döngü yönetimi talimatları

exit do
do ... loop döngüsünden çıkar
exit for
for döngüsünden çıkma

2.5. Bir programın yapısı VB.NET

Kullanıcı tarafından tanımlanmış bir sınıf veya ana işlev Main dışındaki işlevler kullanmayan bir VB.NET programı aşağıdaki yapıya sahip olabilir:


' seçenekler
Option Explicit On 
Option Strict On

' ad alanları
Imports espace1
Imports ....

Module nomDuModule
    Sub main()
....
    End Sub
End Module
  • [Option Explicit on] yönergesi, değişkenlerin bildirilmesini zorunlu kılar. VB.NET'te ise bu zorunlu değildir. Bildirilmemiş bir değişken, bu durumda Object türündedir.
  • [Option Strict on] yönergesi, veri kaybına yol açabilecek tüm veri türü dönüşümlerini ve sayısal türlerle dizeler arasındaki tüm dönüşümleri yasaklar. Bu durumda, dönüşüm işlevlerini açıkça kullanmak gerekir.
  • Program, ihtiyaç duyduğu tüm ad alanlarını içe aktarır. Bu kavramı henüz ele almadık. Önceki programlarda sık sık şu tür komutlarla karşılaştık:
        Console.Out.WriteLine(unechaine)

Aslında şöyle yazmamız gerekirdi:

        System.Console.Out.WriteLine(unechaine)

burada System, [Console] sınıfını içeren ad alanıdır. Bir Imports komutuyla [System] ad alanını içe aktardığımızda, VB.NET, tanımadığı bir sınıfa rastladığında sistematik olarak bu ad alanını tarayacaktır. Aranan sınıfı bulana kadar, bildirilen tüm ad alanlarında aramayı tekrarlayacaktır. Bu durumda şöyle yazılır:


' ad alanları
Imports System
....

        Console.Out.WriteLine(unechaine)

Bir program örneği şu şekilde olabilir:


' seçenekler
Option Explicit On 
Option Strict On

'ad alanları
Imports System

' ana modül
Module main1
    Sub main()
        Console.Out.WriteLine("main1")
    End Sub
End Module

Aynı program şu şekilde yazılabilir:


' seçenekler
Option Explicit On 
Option Strict On

'ad alanları
Imports System

' test sınıfı
Public Class main2
    Public Shared Sub main()
        Console.Out.WriteLine("main2")
    End Sub
End Class

Burada, bir sonraki bölümde tanıtılacak olan sınıf kavramını kullanıyoruz. Böyle bir sınıf, main adlı statik (shared) bir yordam içerdiğinde, bu yordam yürütülür. Bu yazımı buraya eklememizin nedeni, VB.NET'in ikiz dili olan C#'ın yalnızca sınıf kavramını tanımasıdır; c.a.d'e göre, yürütülen her kod mutlaka bir sınıfa aittir. Sınıf kavramı nesne yönelimli programlamaya aittir. Bunu her programın tasarımında zorunlu kılmak biraz sakıncalıdır. Bunu, önceki programın 2. sürümünde görüyoruz; burada, gerek olmadığı halde sınıf ve statik yöntem kavramlarını eklemek zorunda kalıyoruz. Bu nedenle, bundan sonra sınıf kavramını yalnızca gerekli olduğunda kullanacağız. Diğer durumlarda ise, yukarıdaki 1. sürümde olduğu gibi modül kavramını kullanacağız.

2.6. VB.NET programının derlenmesi ve çalıştırılması

VB.NET programının derlenmesi için yalnızca SDK.NET gereklidir. Şu programı ele alalım:


' seçenekler
Option Explicit On 
Option Strict On

' ad alanları
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

Bu programın [boucles1.vb] adlı bir dosyada olduğunu varsayalım. Derlemek için şu adımları izleriz:

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 programı, VB.NET derleyicisidir. Burada, PATH'te DOS vardı:


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] derleyicisi, .NET sanal makinesi tarafından çalıştırılabilen bir .exe dosyası üretir:

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

2.7. IMPOTS örneği

Bir vergi mükellefinin vergisini hesaplayabilen bir program yazmayı hedefliyoruz. Beyan edeceği tek geliri maaşı olan bir vergi mükellefinin basitleştirilmiş durumunu ele alalım:

  • evli değilse, çalışanın pay sayısı nbParts=nbEnfants/2 +1 olarak hesaplanır, evliyse nbEnfants/2+2 olarak hesaplanır; burada nbEnfants, çocuk sayısıdır.
  • En az üç çocuğu varsa, yarım pay daha ekler
  • vergilendirilebilir geliri R=0,72*S olarak hesaplanır; burada S, yıllık maaşıdır
  • aile katsayısı QF = R/nbParts olarak hesaplanır
  • Vergisi I hesaplanır. Aşağıdaki tabloyu ele alalım:
12620,0
0
0
13190
0,05
631
15640
0,1
1290,5
24.740
0,15
2072,5
31810
0,2
3309,5
39.970
0,25
4900
48360
0,3
6898,5
55790
0,35
9316,5
92970
0,4
12106
127.860
0,45
16754,5
151250
0,50
23147,5
172.040
0,55
30710
195.000
0,60
39312
0
0,65
49062

Her satırda 3 alan vardır. I vergisini hesaplamak için, QF<=alan1 olan ilk satır aranır. Örneğin, QF=23000 ise şu satır bulunur:

    24740        0.15        2072.5

bulunur. I vergisi bu durumda 0,15*R - 2072,5*nbParts'e eşittir. Eğer QF, QF<=alan1 ilişkisini hiçbir zaman karşılamıyorsa, o zaman son satırdaki katsayılar kullanılır. Burada:

    0                0.65        49062

bu da I=0,65*R - 49062*nbParts vergi tutarını verir. Buna karşılık gelen VB.NET programı şöyledir:


' seçenekler
Option Explicit On 
Option Strict On

' ad alanları
Imports System

Module impots
    ' ------------ ana
    Sub Main()

        ' vergi hesaplaması için gerekli veri tabloları
        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}

        ' medeni durum bilgisi alınır
        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"

        ' çocuk sayısı
        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
        ' maaş
        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
        ' pay sayısının hesaplanması
        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
        ' vergilendirilebilir gelir
        Dim Revenu As Decimal
        Revenu = 0.72D * Salaire

        ' aile katsayısı
        Dim QF As Decimal
        QF = Revenu / NbParts

        ' QF değerine karşılık gelen vergi diliminin belirlenmesi
        Dim i As Integer
        Dim NbTranches As Integer = Limites.Length
        Limites((NbTranches - 1)) = QF
        i = 0
        While QF > Limites(i)
            i += 1
        End While
        ' vergi
        Dim impots As Integer = CInt(i * 0.05D * Revenu - CoeffN(i) * NbParts)

        ' sonuç görüntülenir
        Console.Out.WriteLine(("Impôt à payer : " & impots))
    End Sub
End Module

Program, bir DOS penceresinde şu komutla derlenir:

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

Derleme işlemi sonucunda impots.exe adlı bir yürütülebilir dosya oluşturulur. impots.exe dosyasının işlemci tarafından doğrudan çalıştırılamayacağına dikkat edilmelidir. Aslında bu dosya, yalnızca bir .NET platformunda çalıştırılabilen ara kod içerir. Elde edilen sonuçlar şunlardır:

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. Ana programın argümanları

Main ana yordamı, bir dize dizisini parametre olarak kabul edebilir:


    Sub main(ByVal args() As String)

args parametresi, program çağrıldığında komut satırından geçirilen argümanları alan bir karakter dizisi dizisidir.

  • args.Length, args dizisinin eleman sayısıdır
  • args(i), dizinin i'inci elemanıdır

P programını şu komutla çalıştırırsak: P arg0 arg1 … argn ve P programındaki Main yordamı şu şekilde tanımlanmışsa:


    Sub main(ByVal args() As String)

arg(0)="arg0", arg(1)="arg1" … gibi olur. İşte bir örnek:


' yönergeler
Option Strict On
Option Explicit On 

' ad alanları
Imports System

Module arg
    Sub main(ByVal args() As String)
        ' argüman sayısı
        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

Çalıştırıldığında şu sonuçlar elde edilir:

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

2.9. Sıralamalar

Bir sıralama, değer alanı tamsayı sabitlerinden oluşan bir veri türüdür. Bir sınavdaki notları yönetmesi gereken bir program düşünelim. Beş not vardır: Yeterli, AssezBien, İyi, TrèsBien, Mükemmel. O halde bu beş sabit için bir sıralama tanımlayabiliriz:


    Enum mention
        Passable
        AssezBien
        Bien
        TrésBien
        Excellent
    End Enum

Sistem içinde, bu beş sabit, ilk sabit için 0, sonraki sabit için 1 vb. ile başlayan ardışık tamsayılarla kodlanır. Bir değişken, bu sıralamadaki değerleri alacağı şekilde tanımlanabilir:


         ' sıralamadan değer alan bir değişken
        Dim maMention As mention = mention.Passable

Bir değişken, sıralamanın olası farklı değerleriyle karşılaştırılabilir:


         ' sıralama değeriyle test
        If (maMention = mention.Passable) Then
            Console.Out.WriteLine("Peut mieux faire")
        End If

Sıralamanın tüm değerlerini elde edebiliriz:


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

Basit tür Integer'in Int32 yapısına eşdeğer olması gibi, basit tür Enum de Enum yapısına eşdeğerdir. Bu sınıf, parametre olarak geçirilen bir sıralı türün tüm değerlerini elde etmeyi sağlayan GetValues adlı statik bir yönteme sahiptir. Bu parametre, bir verinin türü hakkında bilgi veren bir sınıf olan Type türünde bir nesne olmalıdır. Bir v değişkeninin türü, v.GetType() ile elde edilir. Dolayısıyla burada maMention.GetType() işlevi, mentions ve Enum.GetValues(maMention.GetType()) ise mentions sıralamasının değerler listesini verir.

Aşağıdaki programda bu durum gösterilmektedir:


' yönergeler
Option Strict On
Option Explicit On 

' ad alanları
Imports System

Public Module enum2

    ' bir sıralama
    Enum mention
        Passable
        AssezBien
        Bien
        TrèsBien
        Excellent
    End Enum

    ' test sayfası
    Sub Main()

        ' belirtilen sıralamadan değer alan bir değişken
        Dim maMention As mention = mention.Passable

        ' değişken değerinin görüntülenmesi
        Console.Out.WriteLine("mention=" & maMention)

        ' sıralama değeriyle test
        If (maMention = mention.Passable) Then
            Console.Out.WriteLine("Peut mieux faire")
        End If

        ' sabit değerlerin listesi
        For Each m As mention In [Enum].GetValues(maMention.GetType)
            Console.Out.WriteLine(m.ToString)
        Next

        ' tam ifadelerin listesi
        For Each m As Integer In [Enum].GetValues(maMention.GetType)
            Console.Out.WriteLine(m)
        Next
    End Sub
End Module

Çalıştırma sonuçları şöyledir:

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

2.10. İstisna Yönetimi

Birçok VB.NET işlevi, istisnalar, yani hatalar oluşturabilir. Bir işlevin istisna oluşturma olasılığı varsa, programcı, hatalara karşı daha dayanıklı programlar elde etmek amacıyla bu istisnayı yönetmelidir: Uygulamanın kontrolsüz bir şekilde "çökmesi" her zaman önlenmelidir.

Bir istisnanın yönetimi aşağıdaki şemaya göre gerçekleştirilir:

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

İşlev bir istisna oluşturmazsa, bir sonraki komuta geçilir; aksi takdirde, catch cümlesinin gövdesine geçilir ve ardından bir sonraki komuta geçilir. Aşağıdaki noktalara dikkat edelim:

  • e, Exception türünden türetilmiş bir nesnedir. IOException, SystemException vb. türleri kullanılarak daha kesin bir tanımlama yapılabilir: çeşitli istisna türleri mevcuttur. catch e as Exception yazarak, tüm istisna türlerini yönetmek istediğimizi belirtiriz. try cümlesinin kodu birden fazla istisna türü oluşturabiliyorsa, istisnayı birden fazla catch cümlesiyle yöneterek daha kesin bir tanımlama yapmak isteyebiliriz:
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
  • try/catch maddelerine bir finally maddesi eklenebilir:
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

İstisna olsun ya da olmasın, finally maddesinin kodu her zaman yürütülecektir.

  • catch cümlesinde, mevcut olan Exception nesnesini kullanmak istemeyebilirsiniz. Bu durumda, catch e as Exception yazmak yerine catch yazılır.
  • Exception sınıfında, meydana gelen hatayı ayrıntılı olarak açıklayan bir mesaj olan Message özelliği bulunur. Dolayısıyla bunu görüntülemek istersek şunu yazacağız:
catch e as Exception
    Console.Error.WriteLine("L'erreur suivante s'est produite : "+e.Message);
    ...
end try
  • Exception sınıfında, istisnanın türünü ve Message özelliğinin değerini belirten bir karakter dizesi döndüren ToString yöntemi bulunur. Böylece şu şekilde yazabiliriz:
catch  ex as Exception
    Console.Error.WriteLine("L'erreur suivante s'est produite : "+ex.ToString)
    ...
end try

Aşağıdaki örnek, mevcut olmayan bir dizi elemanının kullanılması sonucu oluşan bir istisnayı göstermektedir:


' seçenekler
Option Explicit On 
Option Strict On

' ad alanları
Imports System

Module tab1
    Sub Main()
        ' dizinin tanımlanması ve başlatılması
        Dim tab() As Integer = {0, 1, 2, 3}
        Dim i As Integer

        ' for döngüsüyle dizi görüntüleme
        For i = 0 To tab.Length - 1
            Console.Out.WriteLine(("tab[" & i & "]=" & tab(i)))
        Next i

        ' for each döngüsüyle dizi görüntüleme
        Dim élmt As Integer
        For Each élmt In tab
            Console.Out.WriteLine(élmt)
        Next élmt

        ' istisna oluşturma
        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

Programın çalıştırılması sonucunda aşağıdaki çıktılar elde edilir:

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.

İşte, bir dize bir sayıya atanırken, dizenin bir sayı olmadığını gösterdiği durumlarda ortaya çıkan istisnayı işleyen başka bir örnek:


' seçenekler
Option Strict On
Option Explicit On 

'içe aktarmalar
Imports System

Public Module console1
  Public Sub Main()
    ' Ad soruluyor
    System.Console.Write("Nom : ")

        ' yanıt okuma
    Dim nom As String = System.Console.ReadLine()

        ' yaş soruluyor
    Dim age As Integer
    Dim ageOK As Boolean = False
    Do While Not ageOK
      ' soru
      Console.Out.Write("âge : ")
      ' cevabın okunması ve doğrulanması
      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

        ' son ekran
    Console.Out.WriteLine("Vous vous appelez [" & nom & "] et vous avez [" & age & "] ans")
  End Sub
End Module

Bazı çalıştırma sonuçları:

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. Bir fonksiyona parametrelerin aktarılması

Burada, bir fonksiyona parametrelerin nasıl aktarıldığına odaklanacağız. Şu fonksiyonu ele alalım:


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

Fonksiyon tanımında, a, biçimsel parametre olarak adlandırılır. Bu parametre, yalnızca changeInt fonksiyonunun tanımlanması amacıyla kullanılmaktadır. Aynı şekilde b olarak da adlandırılabilirdi. Şimdi bu fonksiyonun bir kullanım örneğini ele alalım:


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

Burada changeInt(age) komutunda, age, değerini a biçimsel parametresine aktaracak olan etkin parametredir. Burada, bir biçimsel parametrenin kendisine karşılık gelen etkin parametrenin değerini nasıl aldığıyla ilgileniyoruz.

2.11.1. Değerle aktarım

Aşağıdaki örnek, bir fonksiyonun/prosedürün parametrelerinin varsayılan olarak değer yoluyla aktarıldığını göstermektedir: yani, etkin parametrenin değeri, karşılık gelen biçimsel parametreye kopyalanır. Burada iki ayrı varlık söz konusudur. Fonksiyon biçimsel parametreyi değiştirirse, etkin parametre hiçbir şekilde değiştirilmez.


' seçenekler
Option Explicit On 
Option Strict On

' bir fonksiyona değer olarak parametre aktarımı
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

Elde edilen sonuçlar şunlardır:

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

Etkin parametrenin 20 değeri, biçimsel parametre a'e kopyalandı. Bu parametre daha sonra değiştirildi. Etkin parametre ise değişmeden kaldı. Bu aktarım yöntemi, bir fonksiyonun giriş parametreleri için uygundur.

2.11.2. Referansla aktarım

Referansla aktarımda, etkin parametre ile biçimsel parametre tek ve aynı varlıktır. İşlev biçimsel parametreyi değiştirirse, etkin parametre de değiştirilir. VB.NET'te, biçimsel parametrenin önüne ByRef anahtar sözcüğü eklenmelidir. İşte bir örnek:


' seçenekler
Option Explicit On 
Option Strict On

' bir fonksiyona değer yoluyla parametre aktarımı
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

ve yürütme sonuçları:

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

Etkin parametre, biçimsel parametredeki değişikliği takip etmiştir. Bu aktarım yöntemi, bir fonksiyonun çıktı parametreleri için uygundur.