Sejak lahirnya bahasa Visual Basic pada tahun 1991, bahasa ini telah menjadi alat yang sangat efisien untuk membangun aplikasi. Hampir 20 tahun kemudian, ia terus memberikan integrasi yang mudah dengan Microsoft .NET Framework, memungkinkan pengembang untuk menulis aplikasi yang menjangkau desktop, ponsel, browser, dan bahkan cloud.
Microsoft akan merilis Visual Studio 2010 bulan ini, yang mencakup Visual Basic versi 10 (terkadang disebut VB 2010 atau VB10). Rilis ini adalah yang paling canggih dan menyertakan banyak fitur penghemat waktu untuk membantu pengembang melakukan lebih banyak hal dengan lebih sedikit baris kode. Di sini, Anda akan diberikan semua konten yang diperlukan untuk sepenuhnya memahami dan memanfaatkan Visual Basic di Visual Studio 2010.
ko-evolusi
Di masa lalu, Visual Basic dan C# dikembangkan oleh tim terpisah, yang sering kali mengakibatkan fitur muncul pertama kali dalam satu bahasa, lalu di bahasa lain. Misalnya, C# memiliki properti yang diimplementasikan secara otomatis dan penginisialisasi koleksi yang tidak tersedia di Visual Basic, dan Visual Basic memiliki fitur seperti pengikatan akhir dan parameter opsional yang tidak tersedia di C#. Namun setiap kali suatu bahasa mendapat fitur baru, banyak pelanggan yang meminta fitur tersebut ditambahkan ke bahasa lain juga.
Untuk mengatasi kebutuhan ini, Microsoft menggabungkan tim Visual Basic dan C# untuk menerapkan strategi ko-evolusi. Tujuannya adalah untuk mendorong perkembangan umum bahasa-bahasa ini. Ketika fitur utama diperkenalkan dalam satu bahasa, fitur tersebut juga muncul dalam bahasa lain. Hal ini tidak berarti bahwa setiap fitur akan hadir dalam kedua bahasa dan bekerja dengan cara yang persis sama; pada kenyataannya, setiap bahasa memiliki sejarah, jiwa, dan perasaannya sendiri – dan karakteristik ini penting untuk dipertahankan.
Di .NET Framework 4, Visual Basic dan C# mengambil langkah besar menuju tujuan ini, masing-masing menyerap banyak fitur yang ada. Namun, ko-evolusi tidak hanya mempengaruhi fungsi sebelumnya; tetapi juga merupakan strategi untuk pengembangan bahasa-bahasa ini di masa depan. Dalam semangat ini, .NET Framework 4 memperkenalkan fitur-fitur baru yang kuat dalam kedua bahasa, seperti runtime bahasa dinamis, tipe interop yang tertanam, dan varians generik, yang memungkinkan pengembang Visual Basic dan C# untuk memanfaatkan .NET Framework sepenuhnya.
Apa yang baru di Visual Basic 2010
Fitur baru di Visual Basic 2010 dirancang untuk membantu Anda melakukan lebih banyak hal dengan lebih sedikit baris kode. Tim desain Visual Basic kami mencermati tempat-tempat di mana pengembang biasanya harus menulis banyak kode boilerplate yang membosankan dan menemukan cara untuk membiarkan kompiler melakukan pekerjaannya. Tentu saja ini adalah tampilan keseluruhan, sekarang mari kita lihat lebih dalam setiap fiturnya.
Karakter kelanjutan garis implisit
Visual Basic adalah bahasa berorientasi garis yang menggunakan sintaksis yang jelas mirip dengan bahasa Inggris untuk meningkatkan keterbacaan. Namun hal ini sering kali mengakibatkan kode mencapai batas 80 karakter per baris, sehingga memaksa pengembang untuk melakukan banyak pengguliran. Anda dapat menggunakan karakter garis bawah untuk memberi tahu kompiler bahwa pemrosesan baris berikutnya harus dilanjutkan sebagai baris saat ini (yaitu, memperlakukan beberapa baris fisik sebagai satu baris logis). Namun harus mengetikkan karakter garis bawah berulang kali memang menjengkelkan, dan faktanya, permintaan fitur utama selama bertahun-tahun adalah agar kompiler memperbaiki masalah ini.
Di Visual Basic 2010, kompiler dapat mengatasi masalah ini. Kompiler sekarang mengetahui token mana (seperti koma, tanda kurung, dan operator) yang cenderung muncul sebelum karakter kelanjutan baris, dan menyisipkan karakter sehingga pengembang tidak perlu lagi menyisipkan karakter. Misalnya, tentu saja tidak logis untuk mengakhiri pernyataan Visual Basic dengan koma; kompiler mengetahui hal ini, sehingga ketika kompilator melihat aliran token seperti {koma, enter}, ia menyimpulkan keberadaan karakter kelanjutan baris, seperti yang ditunjukkan pada Gambar. Contoh pada 1 ditunjukkan.
Gambar 1 Menyimpulkan karakter kelanjutan garis
<Extension()>
Fungsi FilterBerdasarkan Negara(
Pelanggan ByVal Sebagai IEnumerable (Pelanggan),
Negara ByVal Sebagai String) Sebagai IEnumerable(Dari Pelanggan)
Kueri redup=
Dari c Dalam pelanggan
Dimana c.Negara = negara
Pilih <Pelanggan>
<%=
c.Nama &
, &
c.Negara
%>
</Pelanggan>
Kembalikan permintaan
Fungsi Akhir
Pada Visual Basic 2008, kode pada Gambar 1 membutuhkan 9 karakter garis bawah. Namun, dalam setiap kasus berikut, kompilator menyimpulkan kapan karakter garis bawah diperlukan dan mengizinkannya untuk diabaikan:
Setelah atribut <Extension()>
setelah ((tanda kurung kiri) dalam deklarasi metode
setelah , (koma) pada parameter pertama
sebelum ) (tanda kurung kanan) dalam deklarasi metode
setelah = (tanda sama dengan)
setelah <%= (tag pembuka dari ekspresi yang disematkan)
Setelah setiap ampersand (ampersand) dalam teks XML
sebelum %> (tag akhir dari ekspresi yang disematkan)
Fitur kompiler baru ini sangat berguna untuk tanda tangan metode, yang juga akan berfungsi dengan baik selama lebih dari 80 karakter dalam contoh yang ditunjukkan (jika setiap bagian berada pada baris yang sama). Pada Gambar 2, Anda akan melihat semua kombinasi tag dan posisi yang karakter kelanjutan barisnya tersirat.
Gambar 2 Ketika karakter kelanjutan garis tersirat
tanda | Sebelum | setelah |
, (koma), . (titik), > (atribut), ( { (kurung kiri), <%= (tag awal ekspresi tersemat (teks XML)) | X | |
), }, ] (kurung kanan), %> (tag akhir ekspresi tersemat) | X | |
Semua kata kunci LINQ: Agregat, Berbeda, Dari, Kelompokkan Oleh, Gabung Kelompok, Gabung, Biarkan, Urutkan Berdasarkan, Pilih, Lewati, Lewati Sementara, Ambil, Ambil Sementara, Dimana, Masuk, Ke, Aktif, Naik, Turun | X | X |
Operator: +, -,*,/,/,^,>>,<<,Mod,&,+=,-=,*=,/=,/=,^=,>>=,<<=, & =, <, <=, >, >=, <>, Adalah, Bukan, Suka, Dan, Atau, Xor, Dan Juga, AtauLainnya | X | |
Dengan (dalam penginisialisasi objek) | X |
Seperti yang Anda lihat, ada lebih dari 60 tempat dalam bahasa yang tidak memerlukan karakter garis bawah. (Faktanya, tidak ada contoh kode dalam artikel ini yang memerlukan karakter kelanjutan baris.) Tentu saja, Anda masih dapat menggunakan karakter garis bawah, sehingga kode dari Visual Basic versi sebelumnya akan tetap dikompilasi seperti yang diharapkan.
PernyataanLambda
Istilah lambda mungkin terdengar menakutkan pada awalnya, tetapi lambda hanyalah sebuah fungsi yang didefinisikan dalam fungsi lain. Visual Basic 2008 memperkenalkan ekspresi lambda dengan kata kunci Function:
Dim customers As Customer() = ...
Array.FindAll(pelanggan, Fungsi(c) c.Negara = Kanada)
Ekspresi Lambda memungkinkan Anda mengekspresikan logika secara lokal dengan cara yang terperinci dan ringkas tanpa harus membaginya ke beberapa metode. Misalnya, berikut adalah representasi kode sebelumnya di Visual Basic 2005 (yang tidak mendukung ekspresi lambda):
Dim query = Array.FindAll(customers, AddressOf Filter)
...
Filter Fungsi (ByVal c Sebagai pelanggan) Sebagai Boolean
Pengembalian c.Negara = Kanada
Fungsi Akhir
Sayangnya, ekspresi lambda Visual Basic 2008 memerlukan ekspresi untuk mengembalikan nilai, jadi kode berikut:
Array.ForEach(customers, Function(c) Console.WriteLine(c.Country))
Akan mengarah pada situasi berikut:
'Compile error: Expression does not produce a value.
Console.WriteLine adalah prosedur Sub (tidak berlaku di C#), sehingga tidak mengembalikan nilai, itulah sebabnya kompiler menghasilkan kesalahan. Untuk menangani situasi ini, Visual Basic 2010 memperkenalkan dukungan untuk lambda pernyataan, yaitu lambda yang berisi satu atau lebih pernyataan:
Array.ForEach(customers, Sub(c) Console.WriteLine(c.Country))
Karena Console.WriteLine tidak mengembalikan nilai, kita cukup membuat Sub lambda alih-alih Lambda Fungsi. Berikut contoh lain menggunakan beberapa pernyataan:
Array.ForEach(customers, Sub(c)
Console.WriteLine(Nama Negara :)
Console.WriteLine(c.Negara)
Sub Akhir)
Saat kode ini dijalankan, ia mencetak dua baris untuk setiap pelanggan. Perhatikan juga bahwa jika Anda mengarahkan kursor ke c saat melakukan pengkodean, Anda akan melihat bahwa kompiler akan menyimpulkan tipe tersebut sebagai Pelanggan (juga sah untuk mengetik c Sebagai Pelanggan untuk mendeklarasikan tipe tersebut secara eksplisit). Menulis event handler secara dinamis adalah kegunaan lain dari lambda pernyataan:
AddHandler b.Click, Sub(sender As Object, e As EventArgs)
Kotak Pesan (Tombol Diklik)
'masukkan logika yang lebih kompleks di sini
Akhiri Sub
Dan sebenarnya, Anda dapat menggunakan lambda pernyataan dengan fitur yang diperkenalkan dalam Visual Basic 2008: delegasi longgar. (Anda dapat menggunakan delegasi – penunjuk fungsi yang aman untuk mengetik – untuk menjalankan beberapa fungsi sekaligus.) Kombinasi ini menghasilkan tanda tangan yang lebih sederhana:
AddHandler b.Click, Sub()
Kotak Pesan (Tombol Diklik)
'masukkan logika yang lebih kompleks di sini
Akhiri Sub
Kelonggaran delegasi memungkinkan Anda untuk sepenuhnya mengabaikan parameter dalam event handler – ini adalah keuntungan yang bagus, selama parameter tersebut tidak digunakan sama sekali, sehingga parameter tersebut hanya mengganggu secara visual.
Selain lambda Sub baris tunggal dan Sub lambda multi baris yang telah kita lihat sejauh ini, Visual Basic 2010 juga mendukung lambda Fungsi multi baris:
Dim query = customers.Where(Function(c)
'Kembalikan hanya pelanggan yang belum disimpan
'masukkan logika yang lebih kompleks di sini
Kembali c.ID = -1
Fungsi Akhir)
Aspek menarik lainnya dari lambda pernyataan adalah bagaimana lambda tersebut bersinggungan dengan delegasi anonim yang diperkenalkan dalam Visual Basic 2008. Orang sering bingung mendelegasikan ini dengan metode anonim C#, meskipun keduanya tidak sepenuhnya sama. Delegasi anonim terjadi ketika kompiler Visual Basic menyimpulkan tipe delegasi berdasarkan tanda tangan metode lambda:
Dim method = Function(product As String)
Jika produk = Kertas Lalu
Kembalikan 4,5' unit dalam stok
Kalau tidak
Kembalikan 10 '10 dari yang lainnya
Akhiri Jika
Fungsi Akhir
Kotak Pesan(metode(Kertas))
Jika Anda menjalankan kode ini, Anda akan melihat nilai 4.5 ditampilkan di kotak pesan. Selain itu, jika Anda mengarahkan kursor ke metode, Anda akan melihat teks Redupkan metode Sebagai <Function(String) As Double>. Karena kami tidak menyediakan tipe delegasi sebenarnya, kompiler akan secara otomatis menghasilkan tipe delegasi sebagai berikut:
Delegate Function $compilerGeneratedName$(product As String) As Double
Ini disebut delegasi anonim karena hanya akan muncul dalam kode yang dihasilkan oleh kompiler, bukan dalam kode yang tertulis. Perhatikan bahwa pada kenyataannya tidak ada klausa As yang disediakan untuk menentukan tipe kembalian lambda, kompiler menyimpulkan tipe kembalian menjadi Double. Kompiler akan melihat semua pernyataan return dalam lambda dan akan menentukan tipe Double (4.5) dan Integer (10):
'Notice the As Single
Metode redup = Fungsi (produk Sebagai String) Sebagai Tunggal
Jika produk = Kertas Lalu
Kembalikan 4,5' unit dalam stok
Kalau tidak
Kembalikan 10 '10 dari yang lainnya
Akhiri Jika
Fungsi Akhir
Ia kemudian menjalankan algoritma tipe dasar dan menentukan bahwa ia dapat dengan aman mengkonversi 10 menjadi Double, namun tidak dapat dengan aman mengkonversi 4,5 ke Integer oleh karena itu Double adalah pilihan yang lebih baik;
Anda juga dapat mengontrol tipe kembalian secara eksplisit, dalam hal ini kompiler tidak akan mencoba menyimpulkan tipe tersebut. Sangat umum untuk menetapkan lambda ke variabel dengan tipe delegasi eksplisit, daripada mengandalkan kompiler untuk menyimpulkan tipe delegasi:
Dim method As Func(Of String, Single) =
Fungsi (produk)
Jika produk = Kertas Lalu
Kembalikan 4,5' unit dalam stok
Kalau tidak
Kembalikan 10 '10 dari yang lainnya
Akhiri Jika
Fungsi Akhir
Karena tipe target eksplisit disediakan, tidak perlu mendeklarasikan As String atau As Single; kompilator dapat menyimpulkan keberadaannya berdasarkan tipe delegasi di sisi kiri pernyataan. Jadi jika Anda mengarahkan kursor ke produk, Anda akan melihat bahwa tipe yang disimpulkan adalah String. Anda tidak perlu lagi menentukan As Single karena tipe delegasi sudah menyediakan informasi tersebut. Pada contoh sebelumnya, tanda tangan delegasi Func (yang disertakan dengan .NET Framework) terlihat seperti ini:
Delegate Function Func(Of T, R)(ByVal param As T) As R
Ada satu pengecualian kecil, seperti yang akan kita lihat nanti di bagian Varians Generik.
Properti yang diterapkan secara otomatis
Dalam Visual Basic, properti adalah anggota kelas yang memaparkan keadaan suatu objek ke dunia luar. Deklarasi properti pada umumnya terlihat seperti berikut:
Private _Country As String
Negara Properti Sebagai String
Mendapatkan
Kembali_Negara
Akhir Dapatkan
Set (nilai ByVal Sebagai String)
_Negara = nilai
Kumpulan Akhir
Properti Akhir
Konsep sebenarnya sangat sederhana dengan 10 baris kode. Karena objek tipikal sering kali memiliki lusinan properti, Anda akhirnya menyertakan banyak kode boilerplate dalam definisi kelas Anda. Untuk menyederhanakan tugas tersebut, Visual Basic 2010 memperkenalkan properti yang diimplementasikan secara otomatis, yang memungkinkan Anda mendefinisikan properti sederhana hanya dengan satu baris kode:
Property Country As String
Dalam hal ini, compiler akan terus berjalan dan secara otomatis menghasilkan getter, setter, dan field pendukung. Nama bidang yang didukung selalu merupakan nama atribut yang diawali dengan karakter garis bawah: _Negara dalam contoh ini. Konvensi penamaan ini memastikan kompatibilitas serialisasi biner ketika mengubah properti yang diterapkan secara otomatis ke properti biasa. Serialisasi biner akan terus berfungsi selama nama kolom pendukungnya sama.
Salah satu hal menyenangkan yang dapat Anda lakukan dengan properti yang diimplementasikan secara otomatis adalah menentukan penginisialisasi yang menetapkan nilai default properti saat konstruktor dijalankan. Misalnya, skenario umum dengan kelas entitas menetapkan kunci utama ke nilai seperti -1 untuk menunjukkan bahwa kunci utama berada dalam keadaan belum disimpan. Kodenya akan terlihat seperti ini:
Property ID As Integer = -1
Saat konstruktor berjalan, bidang pendukung (_ID) secara otomatis disetel ke nilai -1. Sintaks penginisialisasi juga berfungsi untuk tipe referensi:
Property OrderList As List(Of Order) = New List(Of Order)
Karena Anda tidak perlu mengetikkan nama tipenya dua kali, baris kode sebelumnya mungkin tidak memiliki karakteristik Visual Basic yang jelas. Kabar baiknya adalah terdapat sintaks yang lebih pendek untuk deklarasi variabel reguler yang konsisten dengan sintaks yang diizinkan oleh Visual Basic:
Property OrderList As New List(Of Order)
Anda bahkan dapat menggunakan sintaks ini dengan penginisialisasi objek untuk memungkinkan properti lain disetel:
Property OrderList As New List(Of Order) With {.Capacity = 100}
Jelasnya, untuk properti yang lebih kompleks, sintaksis yang diperluas masih diperlukan. Anda masih dapat mengetik Property{Tab} untuk mengaktifkan fragmen properti lama. Alternatifnya, setelah mengetik baris pertama properti, Anda cukup memasukkan Get{Enter} dan IDE akan menghasilkan properti gaya lama:
Property Name As String
Mendapatkan
Akhir Dapatkan
Set (nilai ByVal Sebagai String)
Kumpulan Akhir
Properti Akhir
Biasanya ditemukan: sintaks properti baru hampir identik dengan bidang publik, jadi mengapa tidak menggunakan bidang publik saja? Ada beberapa alasan:
Sebagian besar infrastruktur pengikatan data .NET berfungsi dalam bentuk properti, bukan bidang.
Antarmuka tidak dapat memaksakan keberadaan suatu bidang; ia dapat memaksakan keberadaan suatu atribut.
Properti memberikan fleksibilitas jangka panjang untuk mengubah aturan bisnis. Misalnya, seseorang memperkenalkan aturan bahwa nomor telepon harus terdiri dari 10 digit. Validasi ini tidak dapat dilakukan jika ditugaskan ke bidang publik. Mengubah bidang publik menjadi properti merupakan perubahan besar untuk skenario seperti serialisasi biner dan refleksi.
Penginisialisasi koleksi
Praktik .NET yang umum adalah membuat instance koleksi lalu mengisi koleksi dengan memanggil metode Tambah satu kali untuk setiap elemen:
Dim digits As New List(Of Integer)
digit.Tambahkan(0)
digit.Tambahkan(1)
digit.Tambahkan(2)
digit.Tambahkan(3)
digit.Tambahkan(4)
digit.Tambahkan(5)
digit.Tambahkan(6)
digit.Tambahkan(7)
digit.Tambahkan(8)
digit.Tambahkan(9)
Namun untuk konsep yang pada dasarnya sederhana, ada banyak biaya sintaksis. Visual Basic 2010 memperkenalkan inisialisasi koleksi untuk memudahkan Anda membuat instance koleksi. Untuk kode ini:
Dim digits = New List(Of Integer) From {1, 2, 3, 4, 5, 6, 7, 8, 9, 0}
Kompiler akan secara otomatis menghasilkan semua panggilan ke metode Tambah. Anda juga dapat menggunakan fungsionalitas sintaks As New Visual Basic:
Dim digits As New List(Of Integer) From {1, 2, 3, 4, 5, 6, 7, 8, 9, 0}
Perhatikan bahwa di Tim Visual Basic kami selalu menyarankan penggunaan sintaks kedua (Seperti Baru) dibandingkan sintaks sebelumnya karena ini membuat kode lebih tahan terhadap perubahan dalam pengaturan Option Infer.
Anda dapat menggunakan penginisialisasi koleksi terhadap jenis apa pun yang memenuhi persyaratan berikut:
Anda dapat mengulangi tipe tersebut menggunakan pernyataan For Each – yaitu, tipe tersebut mengimplementasikan IEnumerable. (Untuk definisi tipe koleksi yang lebih tepat/detail, lihat Bagian 10.9.3 Spesifikasi Bahasa Visual Basic di msdn.microsoft.com/library/aa711986(VS.71).aspx).
Tipe ini memiliki konstruktor tanpa parameter yang dapat diakses (tetapi belum tentu publik).
Tipe ini memiliki instance atau metode ekstensi yang dapat diakses (namun belum tentu publik) bernama Add.
Artinya Anda juga bisa menggunakan inisialisasi koleksi untuk tipe yang lebih kompleks, seperti kamus:
Dim lookupTable As New Dictionary(Of Integer, String) From
{{1, Satu},
{2, Dua},
{3, Tiga},
{4, Empat}}
(Perhatikan bahwa meskipun pernyataan ini terdiri dari lima baris, tidak ada karakter garis bawah.) Dalam kasus ini, kompiler akan menghasilkan kode yang setara dengan cara lama menginisialisasi kamus:
Dim lookupTable As New Dictionary(Of Integer, String)
lookupTable.Tambahkan(1, Satu)
lookupTable.Tambahkan(2, Dua)
lookupTable.Tambahkan(3, Tiga)
lookupTable.Add(4, Empat)
Kompiler memanggil metode Tambah dengan dua parameter, bukan satu. Ia mengetahui hal ini karena nilai yang diteruskan ke penginisialisasi koleksi berada di dalam kurung kurawal, seperti ini: {{1, Satu}, {2, Dua}, …}. Untuk setiap rangkaian kurung kurawal bersarang, kompilator mencoba meneruskan parameter ini ke metode Tambah yang kompatibel.
Anda juga dapat menyediakan penerapan Tambahkan kustom Anda sendiri dengan menggunakan metode ekstensi:
<Extension()>
Sub Tambah (sumber ByVal Sebagai IList (Pelanggan),
ByVal id Sebagai Integer,
Nama ByVal Sebagai String,
Kota ByVal Sebagai String)
source.Add(Pelanggan Baru Dengan
{
.ID = identitas,
.Nama = nama,
.Kota = kota
})
Akhiri Sub
(Lihat semua karakter garis bawah yang hilang!) Metode ini memperluas tipe apa pun yang mengimplementasikan IList(Of Customer), yang kemudian memungkinkan Anda menggunakan sintaks penginisialisasi koleksi baru, seperti ini:
Dim list = New List(Of Customer) From
{
{1, Jon, Redmond},
{2, Bob, Seattle},
{3, Sally, Toronto}
}
(Tambahkan tiga pelanggan ke daftar). Anda juga dapat menggunakan penginisialisasi koleksi dengan properti yang diterapkan secara otomatis:
Property States As New List(Of String) From {AL, AK, AR, AZ, ...}
susunan literal
Selain cara yang lebih canggih untuk bekerja dengan tipe koleksi, Visual Basic 2010 juga menyediakan beberapa peningkatan yang kuat untuk bekerja dengan array. Asumsikan kode berikut (berfungsi dengan baik di versi yang lebih lama):
Dim numbers As Integer() = New Integer() {1, 2, 3, 4, 5}
Dengan melihat elemen dalam array ini, jelas bahwa setiap elemen adalah bilangan bulat, jadi harus mencetak Integer dua kali pada baris ini tidak akan menambah nilai apa pun. Literal array memungkinkan Anda membuat array dengan menempatkan semua elemen array di dalam kurung kurawal dan membiarkan kompiler secara otomatis menyimpulkan tipenya:
Dim numbers = {1, 2, 3, 4, 5}
Tipe angkanya bukan Object melainkan Integer() (selama Option Infer diaktifkan), alasannya karena literal array sekarang merepresentasikan dirinya sendiri dan memiliki tipenya sendiri. Mari kita asumsikan contoh yang lebih kompleks:
Dim numbers = {1, 2, 3, 4, 5.555}
Dalam hal ini, tipe angka akan disimpulkan sebagai Double(). Kompiler menentukan tipe dengan memeriksa setiap elemen dalam array dan menghitung tipe dasar, menggunakan algoritma yang sama yang dibahas sebelumnya untuk menyimpulkan tipe kembalian dari pernyataan lambda. Apa yang terjadi jika tidak ada tipe dasar? Misalnya seperti pada kode berikut:
Dim numbers = {1, 2, 3, 4, 5}
Dalam hal ini, mengonversikan Integer ke String akan mengurangi rentang konversi (yaitu, kehilangan data mungkin terjadi pada saat run time), dan demikian pula, mengonversi String ke Integer juga akan mengurangi rentang konversi. Satu-satunya tipe aman yang dapat dipilih adalah Object() (kompiler akan menghasilkan kesalahan jika Option Strict diaktifkan).
Literal array dapat disarangkan untuk membentuk array multidimensi atau array bergerigi:
'2-dimensional array
Matriks redup = {{1, 0}, {0, 1}}
'array bergerigi - tanda kurung memaksa evaluasi array bagian dalam terlebih dahulu
Redup bergerigi = { ({1, 0}), ({0, 1}) }
runtime bahasa dinamis
Meskipun Visual Basic secara teknis merupakan bahasa statis, ia selalu memiliki fitur dinamis yang sangat kuat, seperti pengikatan yang terlambat. Visual Studio 2010 hadir dengan platform baru yang disebut Dynamic Language Runtime (DLR) yang membuatnya lebih mudah untuk membangun bahasa dinamis – dan berkomunikasi di antara mereka. Visual Basic 2010 telah diperbarui untuk sepenuhnya mendukung DLR dalam pengikatnya yang terakhir, memungkinkan pengembang untuk menggunakan perpustakaan dan kerangka kerja yang dikembangkan dalam bahasa lain (seperti IronPython/IronRuby).
Salah satu hal hebat tentang fitur ini adalah secara sintaksis tidak ada yang berubah (pada kenyataannya, tidak ada satu baris kode pun yang dimodifikasi di kompiler untuk mendukung fitur ini). Pengembang masih dapat melakukan operasi pengikatan yang terlambat seperti yang mereka lakukan di Visual Basic versi sebelumnya. Yang berubah adalah kode pada runtime Visual Basic (Microsoft.VisualBasic.dll), yang sekarang mengenali antarmuka IDynamicMetaObjectProvider yang disediakan oleh DLR. Jika suatu objek mengimplementasikan antarmuka ini, runtime Visual Basic akan membuat DLR CallSite dan mengizinkan objek dan bahasa yang menyediakannya untuk memasukkan semantiknya sendiri ke dalam operasi.
Misalnya, pustaka standar Python berisi file bernama random.py, yang memiliki metode bernama shuffle yang dapat digunakan untuk mengatur ulang elemen dalam array secara acak. Memanggil metode ini sederhana:
Dim python As ScriptRuntime = Python.CreateRuntime()
Redupkan acak Sebagai Objek = python.UseFile(random.py)
Item redup = {1, 2, 3, 4, 5, 6, 7}
acak.shuffle(item)
Saat runtime, Visual Basic melihat bahwa objek mengimplementasikan IDynamicMetaObjectProvider dan oleh karena itu meneruskan kontrol ke DLR, yang kemudian berkomunikasi dengan Python dan mengeksekusi metode (meneruskan array yang ditentukan dalam Visual Basic sebagai parameter ke metode).
Ini adalah contoh pemanggilan API berkemampuan DLR, namun pengembang juga dapat membuat API mereka sendiri yang menggunakan fungsi ini. Kuncinya adalah mengimplementasikan antarmuka IDynamicMetaObjectProvider, dalam hal ini kompiler Visual Basic dan C# akan mengenali objek dengan semantik dinamis khusus. Harap jangan mengimplementasikan antarmuka ini secara manual, lebih mudah untuk mewarisi dari kelas System.Dynamic.DynamicObject (yang sudah mengimplementasikan antarmuka ini) dan hanya mengganti beberapa metode. Gambar 3 menunjukkan contoh lengkap pembuatan objek dinamis khusus (kantong properti yang muncul untuk membuat properti dengan cepat) dan menggunakan pengikatan akhir Visual Basic normal untuk memanggil objek. (Untuk informasi lebih lanjut tentang penggunaan DynamicObject, baca artikel bagus Doug Rothaus di blogs.msdn.com/vbteam/archive/2010/01/20/fun-with-dynamic-objects-doug-rothaus.aspx .)
Gambar 3 Buat objek dinamis khusus dan panggil objek tersebut menggunakan pengikatan akhir Visual Basic
Imports System.Dynamic
Modul Modul1
Sub Utama()
Redupkan p As Object = PropertyBag Baru
p.Satu = 1
p.Dua = 2
p.Tiga = 3
Console.WriteLine(p.One)
Console.WriteLine(hal.Dua)
Console.WriteLine(hal.Tiga)
Akhiri Sub
Kelas PropertyBag : Mewarisi DynamicObject
Nilai Pribadi Sebagai Kamus Baru (Dari String, Integer)
Fungsi Penggantian Publik TrySetMember(
Pengikat ByVal Sebagai SetMemberBinder,
Nilai ByVal Sebagai Objek) Sebagai Boolean
nilai(pengikat.Nama) = nilai
Kembali Benar
Fungsi Akhir
Fungsi Penggantian Publik TryGetMember(
Pengikat ByVal Sebagai GetMemberBinder,
Hasil ByRef Sebagai Objek) Sebagai Boolean
Mengembalikan nilai.TryGetValue(binder.Name, hasil)
Fungsi Akhir
Kelas Akhir
Modul Akhir
varians generik
Ini adalah fungsi yang mungkin terdengar rumit pada awalnya (dengan istilah seperti kovarians dan contravariance), namun sebenarnya cukup sederhana. Jika Anda memiliki objek bertipe IEnumerable(Of Apple) dan ingin menetapkannya ke IEnumerable(Of Fruit), ini harus sah karena setiap Apple adalah Buah (diberlakukan melalui warisan). Sayangnya, sebelum Visual Basic 2010, varian generik tidak didukung di kompiler, meskipun sebenarnya didukung di runtime bahasa umum (CLR).
Mari kita lihat contoh pada Gambar 4. Dalam Visual Basic 2008, kode pada Gambar 4 akan menghasilkan kesalahan kompilasi pada baris Dim diaktifkanOnly (atau, jika Option Strict dinonaktifkan, pengecualian runtime). Solusinya adalah dengan memanggil metode ekstensi .Cast sebagai berikut:
'Old way, the call to Cast(Of Control) is no longer necessary in VB 2010
Redupkan EnabledOnly = FilterEnabledOnly(buttons.Cast(Of Control))
Hal ini tidak lagi diperlukan karena dalam Visual Basic 2010, antarmuka IEnumerable telah ditandai sebagai kovarian dengan menggunakan pengubah Out:
Interface IEnumerable(Of Out T)
...
Antarmuka Akhir
Gambar 4 Contoh varian generik
Option Strict On
Formulir Kelas Umum1
Sub Form1_Load() Menangani MyBase.Load
Redupkan tombol Sebagai Daftar Baru (Tombol) Dari
{
Tombol Baru Dengan
{
.Nama = btnOk,
.Diaktifkan = Benar
},
Tombol Baru Dengan
{
.Nama = btnBatal,
.Diaktifkan = Salah
}
}
Redupkan hanya diaktifkan = FilterEnabledOnly(tombol)
Akhiri Sub
Filter FungsiHanya Diaktifkan(
Kontrol ByVal Sebagai IEnumerable (Kontrol)
) Sebagai IEnumerable (Kontrol)
Kontrol Kembali Dari c Dalam
Dimana c.Enabled = Benar
Fungsi Akhir
Kelas Akhir
Ini berarti bahwa parameter generik T sekarang menjadi variabel (yaitu, cocok untuk pewarisan), dan kompiler akan memastikan bahwa parameter tersebut hanya digunakan jika tipenya berasal dari antarmuka. Parameter generik juga dapat berupa variabel invers, artinya parameter tersebut hanya digunakan jika parameter tersebut dimasukkan. Suatu tipe sebenarnya dapat memiliki keduanya. Misalnya, delegasi Func yang dibahas sebelumnya memiliki parameter kontravarian (untuk apa yang diteruskan) dan parameter kovarian (untuk tipe kembalian):
Delegate Function Func(Of In T, Out R)(ByVal param As T) As R
Anda dapat menggunakan pengubah Masuk dan Keluar pada antarmuka dan delegasi khusus. Banyak antarmuka dan delegasi umum di .NET Framework 4 ditandai sebagai variabel; contoh umum mencakup semua delegasi Action/Func, IEnumerable(Of T), IComparer(Of T), IQueryable(Of T), dll.
Hal hebat tentang varians generik adalah fitur ini tidak perlu Anda khawatirkan sama sekali - jika varian tersebut berfungsi dengan baik, Anda tidak akan pernah menyadarinya. Situasi yang pernah mengakibatkan kesalahan kompiler atau panggilan yang diperlukan .Cast(Of T) berfungsi dengan baik di Visual Basic 2010.
Parameter opsional yang ditingkatkan
Parameter opsional memberikan fitur efisiensi berguna yang memungkinkan pengembang membangun metode yang lebih fleksibel dan menghindari kekacauan kelas dengan banyak metode yang berlebihan. Di masa lalu ada sedikit batasan bahwa parameter opsional tidak boleh nol (atau bahkan jenis struktur non-internal apa pun). Visual Basic 2010 sekarang memungkinkan Anda untuk menentukan parameter opsional dari tipe nilai apa pun:
Sub DisplayOrder(ByVal customer As Customer,
OlehVal orderID Sebagai Integer,
Unit ByVal opsional Sebagai Integer? = 0,
Opsional ByVal backgroundColor Sebagai Warna = Tidak Ada)
Akhiri Sub
Dalam contoh ini, unit bertipe Nullable(Of Integer) dan backgroundColor adalah tipe struktur non-konten, namun tetap digunakan sebagai parameter opsional. Visual Basic 2010 juga memberikan dukungan yang lebih baik untuk parameter opsional generik.
Jenis interop tertanam
Kelemahan umum untuk aplikasi yang melakukan interop COM adalah kebutuhan untuk menggunakan Majelis Interop Primer (PIA). PIA adalah rakitan .NET yang bertindak sebagai runtime callable wrapper (RCW) pada komponen COM dan memiliki GUID unik yang mengidentifikasinya. Rakitan .NET berkomunikasi dengan PIA, yang kemudian melakukan penyusunan apa pun yang diperlukan untuk memindahkan data antara COM dan .NET.
Sayangnya, PIA dapat mempersulit penerapan karena merupakan DLL tambahan yang perlu diterapkan ke komputer pengguna akhir. Mereka juga dapat menyebabkan masalah pembuatan versi – misalnya, jika Anda ingin aplikasi Anda berfungsi pada Excel 2003 dan Excel 2007, Anda perlu menyebarkan kedua PIA tersebut dengan aplikasi Anda.
Fitur jenis interop tertanam tertanam langsung ke dalam aplikasi, namun hanya jenis dan anggota dari PIA yang mutlak diperlukan, sehingga tidak perlu menyebarkan PIA ke komputer pengguna akhir.
Untuk mengaktifkan fitur ini pada objek yang sudah ada (diaktifkan secara default untuk referensi baru), pilih referensi di Solution Explorer dan ubah opsi Embed Interop Types di jendela Properties (lihat Gambar 5). Alternatifnya, jika mengkompilasi dengan kompiler baris perintah ming, gunakan saklar /l (atau /link) alih-alih /r dan /reference.
Gambar 5 Mengaktifkan tipe interop tertanam di Solution Explorer
Setelah mengaktifkan fitur ini, aplikasi tidak lagi bergantung pada PIA. Faktanya, jika Anda membuka rakitan di Reflektor atau ildasm, Anda akan melihat bahwa sebenarnya tidak ada referensi ke PIA sama sekali.
Banyak tujuan
Bagian terbaik tentang semua fitur dalam Visual Basic 2010 adalah Anda dapat menggunakannya bahkan dalam proyek yang menargetkan .NET Framework 2.0 hingga .NET Framework 3.5. Ini berarti bahwa fitur-fitur seperti karakter kelanjutan baris implisit, literal array, penginisialisasi koleksi, lambda pernyataan, properti yang diimplementasikan secara otomatis, dll. semuanya akan tersedia di proyek yang ada tanpa harus menargetkan ulang .NET Framework 4 .
Pengecualiannya adalah tipe interop tertanam, yang bergantung pada tipe yang hanya tersedia di .NET Framework 4, oleh karena itu, jika Anda menargetkan .NET Framework versi 2.0 hingga 3.5, Anda tidak dapat menggunakan fitur ini. Selain itu, tipe yang ditandai sebagai variabel hanya ditandai seperti di .NET Framework 4, jadi pada contoh sebelumnya, jika Anda menargetkan versi 2.0 hingga 3.5, Anda masih harus memanggil .Cast(Of T). Namun, jika Anda menargetkan versi sebelumnya, Anda dapat membuat tipe variabel Anda sendiri (menggunakan pengubah In/Out).
Untuk mengubah kerangka target aplikasi Anda saat ini, klik dua kali Proyek Saya, klik tab Kompilasi, klik Opsi Kompilasi Tingkat Lanjut, lalu pilih dari kotak kombo di bagian bawah.
Sebenarnya tidak ada saklar baris perintah ming untuk mengaktifkan fitur ini ketika mengkompilasi dari baris perintah ming. Akibatnya, kompiler melihat rakitan mana yang memberikan definisi System.Object (biasanya mscorlib) dan kerangka kerja mana yang menjadi target rakitan, dan kemudian menandai nilai tersebut dalam rakitan keluaran. (Kompiler menggunakan mekanisme yang sama saat membuat rakitan Silverlight.) Saat menggunakan IDE, semua ini terjadi secara transparan, jadi biasanya Anda tidak perlu khawatir.
Selamat mencoba
Seperti yang Anda lihat, Visual Basic 2010 memiliki banyak fitur canggih yang memungkinkan Anda menjadi lebih produktif sambil menulis lebih sedikit baris kode dan membiarkan compiler melakukan lebih banyak pekerjaan. Dalam artikel ini, saya hanya membahas fitur bahasa, namun ada banyak peningkatan besar pada Visual Basic 2010 IDE. Beberapa peningkatan tercantum di bawah ini:
Navigasi ke
Sorot kutipan
dihasilkan dari penggunaan
IntelliSense yang lebih baik (pencocokan substring, pencarian huruf unta, pola saran – berguna untuk menguji gaya pengembangan Anda terlebih dahulu)
Dukungan beberapa monitor
Perbesar
Tim Visual Basic sangat ingin mendengar tanggapan Anda mengenai upaya kami untuk meningkatkan Visual Basic, jadi kirimkan komentar dan pertanyaan Anda kepada kami di Microsoft Connect. Untuk mempelajari lebih lanjut tentang bahasa dan fitur IDE, lihat konten di msdn.com/vbasic, yang mencakup artikel, contoh, dan video petunjuk. Tentu saja, cara terbaik untuk mempelajarinya adalah dengan mempelajari dan menggunakan produk tersebut, jadi inilah saatnya untuk menginstal dan mencobanya.