Makale Özeti

Bu yazımızda CTP'si yeni yayınlanan Visual Studio 2010 ile beraber Visual Basic'in 10. sürümüyle gelen yeniliklere hızlıca göz atıyoruz.

Makale

Visual Studio 2010 ve .NET Framework 4.0 CTP'lerinin yayınlandığı bugünlerde iki yol sonra karşımıza çıkacak yazılım teknolojilerine yön verme ve inceleme adına heyecanlı günler yaşadığımı itiraf edebilirim.

Visual Studio 2008 ve .NET Framework 4.0 yeni logoları.
Visual Studio 2008 ve .NET Framework 4.0 yeni logoları.

Tüm bu yenilikler arasında tabi ki Visual Basic'in de artık 10'uncu sürümü ile karşı karşıyayız. Bu yazıa şu an yayında olan CTP üzerinden yola çıkarak VB 10 ile beraber gelen yenilikleri inceleyeceğiz.

Statement Lambda

Lambda'lara az çok LINQ ile beraber alışmıştık. VB 10 ile beraber çok ilginç ve bir o kadar da güzel bir özellik geliyor. Ama gelin bunun öncesinde VB 9 ile neler yapardık bir göz atalım.

[VB9]

Public Class Form1

 

    Private Sub Form1_Click(ByVal sender As Object, ByVal e As System.EventArgs)

        MsgBox("Burada")

    End Sub

 

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        AddHandler Me.Click, AddressOf Form1_Click

    End Sub

End Class

Gördüğünüz gibi basit bir şekilde Form'un Load durumunda dinamik olarak yine formun Click event'ını bir Sub'a bağlıyoruz. Böylece artık forma tıklandığında "Burada" mesajı gösterilecek. Tüm bunu yapmak için, yani dinamik event bağlamak için gidip ayrı bir yerde Sub yazmamız ve sonra da AddressOf ile bağlamamız gerekiyordu. Oysa artık satır için Sub var :)

[VB10]

Public Class Form1

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        AddHandler Me.Click, Sub()

                                                     MsgBox("Burada")

                                            End Sub

    End Sub

End Class

Nasıl? Güzel değil mi? Satır içi Sub'ımızı yazdık bitti. Bu işlevselliği AddressOf'u kullandığınız her yerde kullanabileceğinizi düşünürseniz gerçekten süper! Peki ya Function'lar? İşte size satır içi Function kullanımı.

[VB10]

        Dim Fonksyon = Function(x As Integer)

                                           Return x * 2

                                  End Function

        MsgBox(Fonksyon(2))

Yukarıdaki kod içerisinde doğrudan Function'ımızı kodun içinde satır içi yazarak tanımlıyoruz ve sonrasında da rahatlıkla Invoke işlemini gerçekleştirebiliyoruz.

Coşmuş Type Inference

Type Inference'a zaten alışkın durumdayız. VB10 ve VS10 ile beraber bir adım daha ileriye gidiliyor. Örneğin aşağıdaki gibi bir değişken tanımında değişkenin bir Array olduğunu veya ne Array'i olduğunu belirtmenize gerek kalmıyor.

Type Inference'ın bu kadarı :)
Type Inference'ın bu kadarı :)

Unutmayın bu şekilde tanımlamalar performans kaybına neden olmaz. Compiler Compile Time'da gerekli kodları üretecektir.

PLINQ

Parallel LINQ aslında VB'ye özel bir konu değil fakat VS10 ve VB10 ile beraber de geldiği için hızlıca bahsetmek istiyorum. Adından da anlaşılacağı üzere PLINQ'de çalıştırılan sorguların kendi içlerinde birden çok işlemcide çalıştırılmak üzere hazırlanmış durumdalar. Gelin hemen aşağıdaki koda bir göz atalım.

[VB10]

       Dim sayilar = {10, 20, 30, 40}

 

        Dim XML = <Sayilar>

                             <%= From Inc In sayilar.AsParallel

                                      Select <Sayi><%= Inc %></Sayi> %>

                           </Sayilar>

AsParallel metodu otomatik olarak PLINQ kullanılmasını sağlıyor. Normal şartlarda sırası ile 10, 20, 30, 40 sayılarını alırken bu şekilde AsParallel olarak sorgumuzu çalıştırdığımızda 20, 10, 30, 40 gibi bir sonuç elde ediyoruz. Bunun nedeni işlemin paralel bir şekilde çalıştırıldıktan sonra sonucun bize döndürülüyor olması. Bu ufak detay bile aslında PLINQ'in kullanılabileceği ve kullanılamayacağı noktalara karar vermek için yeterli sayılabilir.

Add metodunu defalarca kullanmaktan kurtulunu!

Bu özelliğe başlık bulmakta zorlandığımı sanırım farkına vardınız. Düşünün ki elimizde bir List var ve bu List içerisinde birden çok Item eklememiz gerekiyor. Normal şartlarda her bir Item'ı yaratarak tek tek Add metodunu çağırırdık.

[VB9]

Dim Liste As New List(Of String)

Liste.Add("Ahmet")

Liste.Add("Mehmet")

Peki VB10 tarafında neler yapabiliriz? Yeni bir Keyword'ümüz var : From

[VB10]

 Dim Liste As New List(Of String) From {"Ahmet", "Mehmet"}

Aslında arka planda çalışan yapı doğrudan dizi içerisindeki bir Item için Add metodunu çağırmaktan farklı değil. Örneğin elimizde özel bir sınıfın listesi olsaydı aynı şekilde o sınıftan da objeler yaratarak from ile listeye ekleyebilirdik.

[VB10]

        Dim Liste As New List(Of Adam) From {

            New Adam() With {.Adi = "Ahmet", .Soyadi = "Hebe"},

            New Adam() With {.Adi = "Mehmet", .Soyadi = "Hebe"}}

Örnek kodumuzdaki List bir Adam List'i olduğu için burada önemli olan List sınıfının Add metodunun Adam tipinden değişken istiyor olması. Sırasıyla yaratarak bir array olarak veriyoruz. İsterseniz Adam tipinden List'elerin Add metoduna Overrides keywordü ile bir alternatif eklemek için ExtensionMethod'ları da kullanabilirsiniz.

[VB9]

Module Module1

    <Runtime.CompilerServices.Extension()>

    Sub Add(ByVal x As List(Of Form1.Adam), ByVal Adi As String, ByVal soyadi As String)

        x.Add(New Form1.Adam() With {.Adi = Adi, .Soyadi = soyadi})

    End Sub

End Module

VB9'da tanıştığımız Extension Method'lardan bir adet tanımlayarak Adam tipinden bir Liste oluşturulduğunda bu objelerin bir Add metodlarının olacağını ve Adi, Soyadi olarak String'ler alacağını tanımlıyoruz. Extension Method içerisinde de bu bilgileri alıp yeni bir Adam yaratıp listeye ekliyoruz. Böylece artık elimizdeki listeye Adam eklemek için Add metodunu çağırırken iki adet String verip bir Adam eklenmesini de sağlayabildik. Ama aslında bu Add metodunu da biz değil From keyword'ü kullanacak.

[VB10]

        Dim Liste As New List(Of Adam) From {

            {"Ahmet", "Hebe"},

            {"Mehmet", "Hebe"}}

Böylece artık yukarıdaki kodumuzda doğrudan bilgileri vererek her seferinde New ile obje yaratmadan da istediğimiz kadar Adam ekleyebiliriz.

Property tanımlamaları

C#'dan en çok kıskandığım özelliklerden biri Get ve Set'lerin kısaltılmasıydı. Çoğu zaman Property tanımlarken aslında Get ve Set kodlarını değiştirmiyoruz. Her ne kadar VS içerisinde kısa yolları kullanarak bu kodları yazmıyor olsak da maalesef biz yazmamış olsak da projemizdeki her satır kodun bir gün bir bug olarak karşımıza çıkma ihtimali var :)

[VB9]

Private PAdi As String = "Varsayılan"

Public Property Adi() As String

    Get

        Return PAdi

    End Get

    Set(ByVal value As String)

        PAdi = value

    End Set

End Property

"Eskiden" kelimesini kullanmak için daha erken olsa da maalesef Property'leri VB9'da yukarıdaki şekilde tanımlıyorduk.

[VB10]

        Public Property Adi As String = "Varsayılan"

Sanırım bu kodun üzerine daha fazla söz söylemeye gerek yok.

Son sürpriz!

Yukarıdaki kodlar dikkatinizi çekmediyse ufak bir ipucunda buluniyim. Tek satırda yazılması gereken kodları çoklu satırlı olarak yazarken bir değişiklik görebiliyor musunuz?

[VB9]

        Dim Liste2 As New List(Of Adam) From { _

            {"Ahmet", "Hebe"}, _

            {"Mehmet", "Hebe"}}

[VB10]

        Dim Liste As New List(Of Adam) From {

            {"Ahmet", "Hebe"},

            {"Mehmet", "Hebe"}}

Benim sanırım en çok sevindiğim gelişmelerden biri bu oldu. Artık uzun uzun tek satırda kod yazmak zorunda değiliz veya her satır atlamak istediğimizde _ alt çizgi ile alt satıra geçme zorunluluğu da yok! C#'dan en çok kıskandığım özelliklerden biri de buydu.

VB kolayın kullanımını arttırarak kuvvetli bir dil olarak var olma yolunda tam gaz devam ediyor. Gelişmeler çok sevindirici. Bakalım 2010'a kadar karşımıza çıkacak diğer CTP'lerde neler olacak.

Hepinize kolay gelsin.