Fitur VB9 (Partial Method)

Halo, ini adalah posting keenam saya tentang fitur dari VB9 yaitu Partial Method, anda dapat melihat posting saya sebelumnya:

  • Implicitly typed local vaiable
  • Object initializer
  • Anonymous types
  • Nullable types
  • If Ternary operator

Partial Method pada VB9 adalah fitur yang hampir sama dengan Partial Class yang sudah ada pada VB8, Partial Class pada VB8 sangat berguna terutama untuk memisahkan kode yang digenerate secara otomatis oleh Visual Studio.

Partial method pada VB9 digunakan dengan tujuan memudahkan kita untuk merubah method yang ada pada class yang di generate oleh tools, misal pada penggunaan LINQ to SQL. Karena ketika kita melakukan perubahan terhadap class yang digenerate oleh tools (mis: LINQ to SQL / SQL Metal) maka ketika kita menggenerate class baru lagi dengan menggunakan tools, kemungkinan code kita yang lama akan teroverride oleh code yang digenerate oleh tools tersebut.

Misal class yang digenerate oleh tools sebagai berikut

Class Mahasiswa
    Private _nim As String
    Public Property Nim() As String
        Get
            Return _nim
        End Get
        Set(ByVal value As String)
            _nim = value
        End Set
    End Property
End Class

Kemudian mungkin anda ingin menambahkan method dalam class yang sudah digenerate oleh tools diatas

Class Mahasiswa
    Private _nim As String
    Public Property Nim() As String
        Get
            Return _nim
        End Get
        Set(ByVal value As String)
            CekNim(value)
            _nim = value
        End Set
    End Property
    Private Sub CekNim(ByVal value As String)
        If value = String.Empty Then
            Console.WriteLine("Nim tidak boleh kosong !!")
        End If
    End Sub
End Class

Ketika anda mapping table baru kedalam class (mis: LINQ to SQL) maka class diatas akan degenerate ulang oleh tools, dan method yang anda tambahkan akan hilang karena dioverride oleh code hasil dari tools. Nah bagaimana caranya agar anda dapat menambahkan method pada code hasil geberate dari tools? jawabannya adalah dengan partial method, dengan partial method anda dapat memisahkan method tersebut kedalam file yang berbeda.

Class Mahasiswa
    Private _nim As String
    Public Property Nim() As String
        Get
            Return _nim
        End Get
        Set(ByVal value As String)
            CekNim(value)
            _nim = value
        End Set
    End Property
    Partial Private Sub CekNim(ByVal value As String)
    End Sub
End Class
Partial Class Mahasiswa
    Private Sub CekNim(ByVal value As String)
        If value = String.Empty Then
            Console.WriteLine("Nim tidak boleh kosong !!")
        End If
    End Sub
End Class

Nah fitur partial class ini akan sangat berguna ketika anda menggunakan LINQ to SQL untuk menggenerate code mapping dari table

Selamat Mencoba ^_^

Fitur VB9 (If Ternary Operator)

Halo, ini adalah posting kelima saya tentang fitur dari VB9 yaitu If Ternary operator, anda dapat melihat posting saya sebelumnya:

  • Implicitly typed local vaiable
  • Object initializer
  • Anonymous types
  • Nullable types

Pada VB versi sebelumnya anda pasti pernah menggunakan perintah IIF untuk penggunaan single IF

'penggunaan iif pada VB 
Dim bil1 As Integer = 999
Dim ket As String = IIf(bil1 Mod 2 = 1, "Ganjil", "Genap")
Console.WriteLine(ket) 'menghasilkan output Ganjil

Apakah ada yang salah dari kode diatas? memang tidak sih, outputnya benar dan sesuai yang kita harapkan. Tetapi sebenarnya IIF pada VB bukan merupakan built-in function tetapi hanya fungsi biasa yang dipanggil dari library. Seperti halnya regular fungsi maka ketika fungsi tersebut dipanggil maka semua argumen dalam fungsi tersebut akan dicek oleh VB compiler sebelum dijalankan.

Sub Main()
    Dim bil1 = 999
    Dim ket As String = IIf(bil1 Mod 2 = 1, Ganjil(), Genap())
End Sub
 
Function Ganjil() As String
    Return "Ganjil"
End Function
 
Function Genap() As String
    Throw New Exception("Error...")
    Return "Genap"
End Function

image

Jika kode diatas dijalankan maka akan menghasilkan error karna ada perintah Throw Exception pada function Genap(), meskipun hasil dari IIF diatas Ganjil() namun oleh Genap() juga dibaca oleh VB sehingga Throw Exception dipanggil. Jadi jika anda selama ini menganggap bahwa IIF sama dengan perintah IF biasa anda salah sangka :). Kode dibawah ini tidak sama dengan kode diatas

Sub Main()
   Dim bil1 = 999
   Dim ket = ""
   If bil1 Mod 2 = 1 Then
       ket = Ganjil()
   Else
       ket = Genap()
   End If
   Console.WriteLine(ket)
End Sub

Kode diatas tidak akan menghasilkan error ketika dijalankan, karena fungsi Genap() tidak dicek ketika IF dieksekusi. Ini juga sama dengan perintah IF Ternary pada VB9 (yang ini benar-benar ternary asli gak seperti IIF)

Sub Main()
    'Real IF Ternary pada VB 9
    Dim bil1 = 999
    Dim ket = If(bil1 Mod 2 = 1, Ganjil(), Genap())
    Console.WriteLine(ket) 'menghasilkan output Ganjil
End Sub

Kode diatas juga tidak akan menghasilkan error jika dijalankan karena menggunakan IF Ternary pada VB9. Dengan IF Ternary pada VB anda juga dapat menuliskan hanya 2 argumen dengan saja misal:

Dim nama As String = Nothing
Dim strnama = If(nama, "Kosong")
Console.WriteLine(strnama) 'outputnya Kosong
nama = "Erick Kurniawan"
strnama = If(nama, "Kosong")
Console.WriteLine(strnama) 'outputnya Erick Kurniawan
 
Dim bil1 As Integer? = Nothing
Dim nilai = If(bil1, -1)
Console.WriteLine(nilai)

Harap diperhatikan bahwa tipe data yang dihasilkan dari IF harus kompatibel dengan nilai yang dibandingkan, jika anda menulis kode sperti dibawah ini maka akan menghasilkan error

image

Fitur VB9 (Nullable types)

Halo, ini adalah posting keempat saya tentang fitur dari VB9 yaitu Nullable type, anda dapat melihat posting saya sebelumnya:

  • Implicitly typed local vaiable
  • Object initializer
  • Anonymous types

Seperti kita ketahui pada CLS terdapat dua tipe data yang disupport yaitu value type (integer,double,boolean,etc) dan reference type (String, StringBuilder, etc), untuk tipe reference jika anda tidak mau memberi nilai maka anda dapat mengesetnya menjadi “Nothing”, tapi lain halnya dengan value type anda tidak bisa tidak meberi nilai, anda harus memberi nilai yang sesuai dengan range nilainya (misal untuk tipe short dari -32000 sd 32000). Ini akan dapat menimbulkan masalah ketika kita melakukan mapping dan mengambil data dari database, misal pada table Mahasiswa field Ipk bernilai null, nah kita akan kesulitan untuk merepresentasikan nilai data field yang kosong tersebut dalam object Mahasiswa.

Nullable types digunakan agar anda dapat memberi nilai null pada value type, sebenarnya pada VB8 anda juga sudah dapat menggunakan nullabe type dengan generic Nullable(Of T)

Sub Main()
        'pada VB8
        Dim bil1 As Nullable(Of Integer)
        bil1 = Nothing
 
        Dim cek As Boolean = bil1.HasValue 'akan bernilai false
        bil1 = 999
        cek = bil1.HasValue 'akan bernilai true
End Sub

Tetapi dengan menggunakan nullable type di VB9 penulisannya menjadi lebih mudah

'nullable pada VB9
Dim i As Integer?
Console.WriteLine(i.HasValue) 'akan bernilai false
i = 999
Console.WriteLine(i.HasValue) 'akan bernilai true

Nullable types akan sangat berguna ketika anda melakukan mapping table pada LINQ to SQL

Fitur VB9 (Anonymous Type)

Halo, ini adalah posting ketiga saya tentang fitur dari VB9 yaitu Anonymous type, anda dapat melihat posting saya sebelumnya:

  • Implicitly typed local vaiable
  • Object initializer

Anonymous type sebenarnya dibutuhkan untuk penggunaan fitur LINQ statements. Sintaks dari anonymous type mirip dengan sintaks object initializer

Sub Main()
       Dim mhs = New With {.Nim = "22002321", .Ipk = 3.5}
       Console.WriteLine(mhs.Nim)
       Console.WriteLine(mhs.Ipk)
       Console.WriteLine(mhs.ToString())
End Sub

image

Dapat anda lihat bahwa variabel mhs dapat digunakan dan berisi property Nim dan Nama padahal anda tidak membuat object Mahasiswa dari class Mahasiswa. Anda juga dapat menggunakan object mhs dari anonymous type untuk membuat object baru:

Dim mhs2 = New With {.Nim = mhs.Nim, .Nama = "Erick", .Ipk = mhs.Ipk}
Console.WriteLine(mhs2.ToString())

Jika anda membandingkan dua object yang sama yang dibuat dengan anonymous type

Dim mhs1 = New With {.Nim = "22002321", .Ipk = 3.5}
Dim mhs2 = New With {.Nim = "22002321", .Ipk = 3.5}
Console.WriteLine(mhs1.Equals(mhs2))

maka statement diatas akan mengahasilkan nilai false biarpun kedua object tersebut isinya sama persis. Hasilnya akan bernilai true hanya jika dibandingkan dengan referensi dari object itu sendiri

Dim mhs1 = New With {.Nim = "22002321", .Ipk = 3.5}
Dim mhs2 = mhs1
'menghasilkan nilai true
Console.WriteLine(mhs1.Equals(mhs2))

Ada fitur yang unik di VB9, yaitu anda dapat menggunakan keyword key jika anda ingin membandingkan nilai dari object tersebut sama atau tidak

'menggunakan keyword key
Dim mhs1 = New With {Key .Nim = "22002321", .Ipk = 3.5}
Dim mhs2 = New With {Key .Nim = "22002321", .Ipk = 3.5}
'menghasilkan nilai true
Console.WriteLine(mhs1.Equals(mhs2))
 
Dim mhs3 = New With {Key .Nim = "22002321", .Ipk = 3.5}
Dim mhs4 = New With {Key .Nim = "22002322", .Ipk = 3.4}
'menghasilkan false
Console.WriteLine(mhs3.Equals(mhs4))

Pada real world, anonymous types digunakan untuk mensupport LINQ statement, contohnya :

Dim mhs = From m In mahasiswa Select New With {m.Nim, m.Ipk}

menarik yaa…

Fitur VB9 (Object initializer)

Halo, ini adalah posting kedua saya tentang fitur dari VB9 yaitu Object initializer, anda dapat melihat posting saya sebelumnya:

  • Implicitly typed local vaiable

Ketika anda menggunakan VB8 dan bekerja dengan class, dan ingin melakukan inisialisasi variabel dalam class maka anda harus membuat oveloading constructor, atau harus menuliskan code yang cukup panjang untuk menginisialisasi property satu-persatu, secagai contoh:

Class Mahasiswa
    Private _nim As String
    Private _ipk As Single
 
    Public Property Nim() As String
        Get
            Return _nim
        End Get
        Set(ByVal value As String)
            _nim = value
        End Set
    End Property
 
    Public Property Ipk() As Single
        Get
            Return _ipk
        End Get
        Set(ByVal value As Single)
            _ipk = value
        End Set
    End Property
End Class

Kemudian untuk membuat object dan menginisialisasi class tersebut lakukan:

Sub Main()
    'inisialisasi object biasa
    Dim mhs1 As New Mahasiswa()
    mhs1.Nim = "22002321"
    mhs1.Ipk = 3.5
 
    'atau dapat ditulis
    Dim mhs2 As New Mahasiswa()
    With mhs2
        .Nim = "22002321"
        .Ipk = 3.5
    End With
End Sub

dengan menggunakan Object initializer anda dapat menuliskannya sebagai berikut:

'dengan menggunakan object initializer
Dim mhs3 As New Mahasiswa() With {.Nim = "22002321", .Ipk = 3.5}

Lebih praktis bukan hehehe..

Fitur VB9 (Implicitly typed local variabel)

Halo, selamat datang di posting pertama saya mengenai fitur VB9, pada artikel ini saya akan membahas “Implictly typed local variabel” pada VB9.

Untuk mendeklarasikan variabel pada VB8 (.NET 2.0) anda dapat menuliskan kode sebagai berikut:

image 

Ketika saya menuliskan deklarasi variable diatas, saya merasa deklarasi tersebut terlalu panjang, karena ketika kita memberikan nilai 999 atau “Erick” maka compiler seharusnya bisa tahu tipe data yang dimasukan kedalam variabel tersebut. Bagaimana jika ditulis seperti ini saja

image

lebih praktis bukan? namun pada VB8 jika ada mendeklarasikan variable seperti diatas maka compiler secara otomatis akan merubah tipenya menjadi tipe “object” / mengganggapnya sebagai “late binding” (option strict = off).

image

Ini akan sangat tidak efektif karena compiler melakukan proses “boxing” dan “unboxing” untuk merubah dari tipe string ke object, object ke string.

Pada VB9 diperkenalkan satu option baru yaitu “Option infer”, dengan mengaktifkan option ini menjadi “on” maka compiler secara otomatis dapat menebak tipe data apa yang dimiliki oleh variabel dari nilai yang kita berikan di sisi kanan. Secara default VB9 mengaktifkan pilihan option infer “on” atau anda juga dapat menuliskannya secara eksplisit pada kode.

image

image

Jika anda cek lagi tipe data dari variable yang ada di sisi kiri, maka tipe datanya akan secara otomatis menyesuaikan dengan nilai yang anda berikan disisi kanan.

image

image

Jika anda tidak mengeset option infer menjadi off maka otomatis tipe akan diubah menjadi object (late binding) seperti pada VB8.

Fitur-fitur Keren VB9

Pada artikel berseri kali ini saya akan membahas fitur-fitur baru nan kereen dari VB9 (.NET 3.0), biarpun VB sering dianggap sebagai “anak tiri” di platform .NET jika dibandingkan dengan saudaranya C# namun mulai VB9 ada beberapa fitur yang membuat programmer VB merasa lebih baik daripada programmer C# (seperti XML Literal dan Late Bound XML misalnya).

Menurut saya VB merupakan bahasa yang unik karena beda dengan bahasa yang lain, misal C#, Java yang termasuk “strongly typed language”, dan Ruby, Phyton, PHP yang “dynamic typed language” maka VB berada ditengah-tengahnya “semi strongly type dan dynamic”, menurut Erik Meijer salah seorang Arsitek VB Team dari Microsoft VB mempunyai mantra yaitu “Static Typing Where Possible, Dynamic Typing When Needed“, dengan demikian programmer VB dapat menggunakan static typing maupun dynamic typing sesuai dengan kebutuhan.

Pada artikel kali ini saya akan mencoba membahas beberapa fitur dari VB9 yaitu:

  • Implicitly typed local variabel
  • Object Initializer
  • Anonymous types
  • Nullable types
  • If Tenary operator
  • Partial Method
  • Extension methods
  • Relaxed delegates
  • LINQ Queries
  • Lambda Expression
  • Expression Tree
  • Friend Assembly
  • Runtime Agility

Dengan senjata-senjata hebat yang ditambahkan di VB9, maka VB menjadi bahasa yang bisa bersaing dengan bahasa popular lain seperti C# atau Java. salam VB :)

Validasi Inputan (C# dan VB.NET)

Kadang kita butuh untuk memvalidasi atau membatasi inputan yang dimasukan oleh user, berikut adalah cara sederhana untuk membatasi inputan agar inputan yang dimasukan hanya bisa berupa angka saja (tidak bisa berupa huruf).

Untuk menangani validasi tersebut buat method berikut

 

(C# version)

private void ValidateInputNumeric(Object sender,KeyPressEventArgs e)
        {
            TextBox t;
            if (sender.GetType() is TextBox)
            {
                t = (TextBox)sender;
                if (t.Name == txtHarga.Name || t.Name == txtStok.Name)
                {
                    if (!Char.IsNumber(e.KeyChar) && e.KeyChar!=(char)8)
                    {
                        e.Handled = true;
                    }
                }
            }
        }

 

(VB version)

Private Sub ValidInputNumeric(ByVal sender As Object, _
    ByVal e As KeyPressEventArgs) Handles txtStok.KeyPress, txtHarga.KeyPress
        Dim t As TextBox
        If sender.GetType() Is GetType(TextBox) Then
            t = CType(sender, TextBox)
            If t.Name = txtHarga.Name Or t.Name = txtStok.Name Then
                If Not Char.IsNumber(e.KeyChar) And _
                e.KeyChar <> vbBack Then
                    e.Handled = True
                End If
            End If
        End If
    End Sub

 

kemudian tambahkan method yang sudah kita buat diatas kedalam event keypress di control yang akan divalidasi (misal: textbox)

 image

 

masukan pada event keypress

image