Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Artikel ini mencantumkan nama fitur utama untuk setiap versi Visual Basic, dengan deskripsi terperinci tentang fitur baru dan yang disempurnakan dalam versi bahasa terbaru.
Versi saat ini
Visual Basic 16.9 / Visual Studio 2019 versi 16.9
Untuk fitur baru, lihat Visual Basic 16.9.
Anda dapat mengunduh .NET SDK terbaru dari halaman unduhan .NET.
Versi sebelumnya
Visual Basic 16.0 / Visual Studio 2019 versi 16.0
Untuk fitur baru, lihat Visual Basic 16.0.
Visual Basic 15.5 / Visual Studio 2017 versi 15.5
Untuk fitur baru, lihat Visual Basic 15.5.
Visual Basic 15.3 / Visual Studio 2017 versi 15.3
Untuk fitur baru, lihat Visual Basic 15.3.
Visual Basic 15 / Visual Studio 2017
Untuk fitur baru, lihat Visual Basic 2017.
Visual Basic / Visual Studio 2015
Untuk fitur baru, lihat Visual Basic 14.
Visual Basic / Visual Studio 2013
Pratinjau teknologi dari .NET Compiler Platform ("Roslyn")
Visual Basic / Visual Studio 2012
Async dan await kata kunci, iterator, atribut info penelepon
Visual Basic, Visual Studio 2010
Properti yang diimplementasikan secara otomatis, penginisialisasi koleksi, kelanjutan baris implisit, variansi co/contra generik, akses namespace layanan global
Visual Basic / Visual Studio 2008
Kueri Terintegrasi Bahasa (LINQ), literal XML, inferensi jenis lokal, penginisialisasi objek, jenis anonim, metode ekstensi, inferensi jenis lokal var , ekspresi lambda, operator, if metode parsial, jenis nilai nullable
Visual Basic / Visual Studio 2005
Jenis My dan jenis pembantu (akses ke aplikasi, komputer, sistem file, jaringan)
Visual Basic / Visual Studio .NET 2003
Operator bit-shift, deklarasi variabel perulangan
Visual Basic / Visual Studio .NET 2002
Rilis pertama Visual Basic .NET
Visual Basic 16.9
Visual Basic 16.9 memungkinkan konsumsi properti khusus init.
Visual Basic 16.0
Visual Basic 16.0 berfokus pada penyediaan lebih banyak fitur Visual Basic Runtime (microsoft.visualbasic.dll) ke .NET Core dan merupakan versi pertama Visual Basic yang berfokus pada .NET Core. Bagian dari Visual Basic Runtime yang bergantung pada WinForms ditambahkan di .NET Core 3.0.
Komentar diizinkan di lebih banyak tempat dalam pernyataan
Di Visual Basic 15.5 dan versi yang lebih lama, komentar hanya diizinkan pada baris kosong, di akhir pernyataan, atau di tempat tertentu dalam pernyataan di mana kelanjutan baris implisit diizinkan. Dimulai dengan Visual Basic 16.0, komentar juga diizinkan setelah kelanjutan baris eksplisit dan dalam pernyataan pada baris yang dimulai dengan spasi diikuti oleh garis bawah.
Public Sub Main()
cmd.CommandText = ' Comment is allowed here without _
"SELECT * FROM Titles JOIN Publishers " _ ' This is a comment
& "ON Publishers.PubId = Titles.PubID " _
_ ' This is a comment on a line without code
& "WHERE Publishers.State = 'CA'"
End Sub
Konversi floating-point ke bilangan bulat yang dioptimalkan
Dalam versi Visual Basic sebelumnya, konversi nilai Ganda dan Tunggal ke bilangan bulat menawarkan performa yang relatif buruk. Visual Basic 16.0 secara signifikan meningkatkan performa konversi floating-point ke bilangan bulat saat Anda meneruskan nilai yang dikembalikan oleh salah satu metode berikut ke salah satu fungsi konversi bilangan bulat Visual Basic intrinsik (CByte, CShort, CInt, CLng, CSByte, CUShort, CUInt, CULng), atau ketika nilai yang dikembalikan oleh salah satu metode berikut secara implisit ditransmisikan ke jenis integral saat Opsi Ketat diatur ke Off:
- Conversion.Fix(Double)
- Conversion.Fix(Object)
- Conversion.Fix(Single)
- Conversion.Int(Double)
- Conversion.Int(Object)
- Conversion.Int(Single)
- Math.Ceiling(Double)
- Math.Floor(Double)
- Math.Round(Double)
- Math.Truncate(Double)
Pengoptimalan ini memungkinkan kode berjalan lebih cepat -- hingga dua kali lebih cepat untuk kode yang melakukan sejumlah besar konversi ke jenis bilangan bulat. Contoh berikut mengilustrasikan beberapa panggilan metode sederhana yang terpengaruh oleh pengoptimalan ini:
Dim s As Single = 173.7619
Dim d As Double = s
Dim i1 As Integer = CInt(Fix(s)) ' Result: 173
Dim b1 As Byte = CByte(Int(d)) ' Result: 173
Dim s1 AS Short = CShort(Math.Truncate(s)) ' Result: 173
Dim i2 As Integer = CInt(Math.Ceiling(d)) ' Result: 174
Dim i3 As Integer = CInt(Math.Round(s)) ' Result: 174
Perhatikan bahwa ini memotong daripada membulatkan nilai floating-point.
Visual Basic 15.5
Di Visual Basic 15.3 dan versi yang lebih lama, ketika panggilan metode menyertakan argumen baik berdasarkan posisi maupun berdasarkan nama, argumen posisi harus mendahului argumen bernama. Dimulai dengan Visual Basic 15.5, argumen posisi dan bernama dapat muncul dalam urutan apa pun selama semua argumen hingga argumen posisi terakhir berada di posisi yang benar. Ini sangat berguna ketika argumen bernama digunakan untuk membuat kode lebih mudah dibaca.
Misalnya, panggilan metode berikut memiliki dua argumen posisi antara argumen bernama. Argumen bernama memperjelas bahwa nilai 19 mewakili usia.
StudentInfo.Display("Mary", age:=19, #9/21/1998#)
Private Protected pengubah akses anggota
Kombinasi kata kunci baru ini mendefinisikan anggota yang dapat diakses oleh semua anggota di kelas yang berisi serta berdasarkan jenis yang berasal dari kelas yang berisi, tetapi hanya jika mereka juga ditemukan dalam rakitan yang berisi. Karena struktur tidak dapat diwariskan, Private Protected hanya dapat diterapkan ke anggota kelas.
Pemisah heks/biner/oktal di depan
Visual Basic 2017 menambahkan dukungan untuk karakter garis bawah (_) sebagai pemisah digit. Dimulai dengan Visual Basic 15.5, Anda dapat menggunakan karakter garis bawah sebagai pemisah terkemuka antara digit awalan dan heksadesimal, biner, atau oktal. Contoh berikut menggunakan pemisah digit terkemuka untuk menentukan 3.271.948.384 sebagai angka heksadesimal:
Dim number As Integer = &H_C305_F860
Untuk menggunakan karakter garis bawah sebagai pemisah terkemuka, Anda harus menambahkan elemen berikut ke file proyek Visual Basic (*.vbproj):
<PropertyGroup>
<LangVersion>15.5</LangVersion>
</PropertyGroup>
Visual Basic 15.3
Saat Anda menetapkan nilai elemen tuple dari variabel, Visual Basic menyimpulkan nama elemen tuple dari nama variabel yang sesuai; Anda tidak perlu secara eksplisit memberi nama elemen tuple. Contoh berikut menggunakan inferensi untuk membuat tuple dengan tiga elemen bernama, state, stateName, dan capital.
Const state As String = "MI"
Const stateName As String = "Michigan"
Const capital As String = "Lansing"
Dim stateInfo = (state, stateName, capital)
Console.WriteLine($"{stateInfo.stateName}: 2-letter code: {stateInfo.State}, Capital {stateInfo.capital}")
' The example displays the following output:
' Michigan: 2-letter code: MI, Capital Lansing
Sakelar pengkompilasi tambahan
Pengompilasi baris perintah Visual Basic sekarang mendukung opsi kompilator -refout dan -refonly untuk mengontrol output rakitan referensi. -refout mendefinisikan direktori output dari perakitan referensi, dan -refonly menentukan bahwa hanya rakitan referensi yang akan dihasilkan oleh kompilasi.
Visual Basic 15
Tuple adalah struktur data ringan yang paling umum digunakan untuk mengembalikan beberapa nilai dari satu panggilan metode. Biasanya, untuk mengembalikan beberapa nilai dari metode , Anda harus melakukan salah satu hal berikut:
Tentukan jenis kustom (atau
ClassStructure). Ini adalah solusi kelas berat.Tentukan satu atau beberapa
ByRefparameter, selain mengembalikan nilai dari metode .
Dukungan Visual Basic untuk tuple memungkinkan Anda dengan cepat menentukan tuple, secara opsional menetapkan nama semantik ke nilainya, dan dengan cepat mengambil nilainya. Contoh berikut membungkus panggilan ke TryParse metode dan mengembalikan tuple.
Imports System.Globalization
Public Module NumericLibrary
Public Function ParseInteger(value As String) As (Success As Boolean, Number As Integer)
Dim number As Integer
Return (Integer.TryParse(value, NumberStyles.Any, CultureInfo.InvariantCulture, number), number)
End Function
End Module
Anda kemudian dapat memanggil metode dan menangani tuple yang dikembalikan dengan kode seperti berikut.
Dim numericString As String = "123,456"
Dim result = ParseInteger(numericString)
Console.WriteLine($"{If(result.Success, $"Success: {result.Number:N0}", "Failure")}")
Console.ReadLine()
' Output: Success: 123,456
Literal biner dan pemisah digit
Anda dapat menentukan literal biner dengan menggunakan awalan &B atau &b. Selain itu, Anda dapat menggunakan karakter garis bawah, _, sebagai pemisah digit untuk meningkatkan keterbacaan. Contoh berikut menggunakan kedua fitur untuk menetapkan Byte nilai dan menampilkannya sebagai angka desimal, heksadesimal, dan biner.
Dim value As Byte = &B0110_1110
Console.WriteLine($"{NameOf(value)} = {value} (hex: 0x{value:X2}) " +
$"(binary: {Convert.ToString(value, 2)})")
' The example displays the following output:
' value = 110 (hex: 0x6E) (binary: 1101110)
Untuk informasi selengkapnya, lihat bagian "Penetapan literal" dari tipe data Byte, Integer, Long, Short, SByte, UInteger, ULong, dan UShort .
Dukungan untuk nilai pengembalian referensi C#
C# mendukung nilai pengembalian referensi. Artinya, ketika metode panggilan menerima nilai yang dikembalikan oleh referensi, metode tersebut dapat mengubah nilai referensi. Visual Basic tidak memungkinkan Anda menulis metode dengan nilai pengembalian referensi, tetapi memungkinkan Anda untuk menggunakan dan memodifikasi nilai pengembalian referensi.
Misalnya, kelas berikut yang Sentence ditulis dalam C# menyertakan FindNext metode yang menemukan kata berikutnya dalam kalimat yang dimulai dengan substring tertentu. String dikembalikan sebagai nilai pengembalian referensi, dan variabel yang Boolean diteruskan oleh referensi ke metode menunjukkan apakah pencarian berhasil. Ini berarti bahwa selain membaca nilai yang dikembalikan, pemanggil juga dapat memodifikasinya, dan modifikasi tersebut tercermin di Sentence kelas .
using System;
public class Sentence
{
private string[] words;
private int currentSearchPointer;
public Sentence(string sentence)
{
words = sentence.Split(' ');
currentSearchPointer = -1;
}
public ref string FindNext(string startWithString, ref bool found)
{
for (int count = currentSearchPointer + 1; count < words.Length; count++)
{
if (words[count].StartsWith(startWithString))
{
currentSearchPointer = count;
found = true;
return ref words[currentSearchPointer];
}
}
currentSearchPointer = -1;
found = false;
return ref words[0];
}
public string GetSentence()
{
string stringToReturn = null;
foreach (var word in words)
stringToReturn += $"{word} ";
return stringToReturn.Trim();
}
}
Dalam bentuk yang paling sederhana, Anda dapat memodifikasi kata yang ditemukan dalam kalimat dengan menggunakan kode seperti berikut ini. Perhatikan bahwa Anda tidak menetapkan nilai ke metode , melainkan ke ekspresi yang dikembalikan metode , yang merupakan nilai pengembalian referensi.
Dim sentence As New Sentence("A time to see the world is now.")
Dim found = False
sentence.FindNext("A", found) = "A good"
Console.WriteLine(sentence.GetSentence())
' The example displays the following output:
' A good time to see the world is now.
Namun, masalah dengan kode ini adalah bahwa jika kecocokan tidak ditemukan, metode mengembalikan kata pertama. Karena contoh tidak memeriksa nilai Boolean argumen untuk menentukan apakah kecocokan ditemukan, contoh memodifikasi kata pertama jika tidak ada kecocokan. Contoh berikut mengoreksi ini dengan mengganti kata pertama dengan dirinya sendiri jika tidak ada kecocokan.
Dim sentence As New Sentence("A time to see the world is now.")
Dim found = False
sentence.FindNext("A", found) = IIf(found, "A good", sentence.FindNext("B", found))
Console.WriteLine(sentence.GetSentence())
' The example displays the following output:
' A good time to see the world is now.
Solusi yang lebih baik adalah menggunakan metode pembantu tempat nilai pengembalian referensi diteruskan oleh referensi. Metode pembantu kemudian dapat mengubah argumen yang diteruskan ke dalamnya dengan referensi. Contoh berikut melakukan itu.
Module Example
Public Sub Main()
Dim sentence As New Sentence("A time to see the world is now.")
Dim found = False
Dim returns = RefHelper(sentence.FindNext("A", found), "A good", found)
Console.WriteLine(sentence.GetSentence())
End Sub
Private Function RefHelper(ByRef stringFound As String, replacement As String, success As Boolean) _
As (originalString As String, found As Boolean)
Dim originalString = stringFound
If found Then stringFound = replacement
Return (originalString, found)
End Function
End Module
' The example displays the following output:
' A good time to see the world is now.
Untuk informasi selengkapnya, lihat Referensi Mengembalikan Nilai.
Visual Basic 14
Anda bisa mendapatkan nama string yang tidak memenuhi syarat dari jenis atau anggota untuk digunakan dalam pesan kesalahan tanpa pengkodean keras string. Ini memungkinkan kode Anda untuk tetap benar saat melakukan refaktor. Fitur ini juga berguna untuk menghubungkan tautan MVC model-view-controller dan menembakkan peristiwa yang diubah properti.
Anda dapat menggunakan ekspresi interpolasi string untuk membuat string. Ekspresi string terinterpolasi terlihat seperti string templat yang berisi ekspresi. String terinterpolasi lebih mudah dipahami sehubungan dengan argumen daripada Pemformatan Komposit.
Akses dan pengindeksan anggota null-conditional
Anda dapat menguji null dengan cara yang sangat ringan sebelum melakukan operasi akses anggota (?.) atau indeks (?[]). Operator ini membantu Anda menulis lebih sedikit kode untuk menangani pemeriksaan null, terutama untuk turun ke struktur data. Jika operand kiri atau referensi objek null, operasi mengembalikan null.
Literal string dapat berisi urutan baris baru. Anda tidak lagi memerlukan pekerjaan lama dalam menggunakan <xml><![CDATA[...text with newlines...]]></xml>.Value
Komentar
Anda dapat menempatkan komentar setelah kelanjutan baris implisit, di dalam ekspresi inisialisasi, dan di antara istilah ekspresi LINQ.
Resolusi nama yang lebih cerdas dan memenuhi syarat
Kode yang diberikan seperti Threading.Thread.Sleep(1000), Visual Basic digunakan untuk mencari namespace "Threading", menemukannya ambigu antara System.Threading dan System.Windows.Threading, lalu melaporkan kesalahan. Visual Basic sekarang mempertimbangkan kedua namespace layanan yang mungkin bersama-sama. Jika Anda menampilkan daftar penyelesaian, editor Visual Studio mencantumkan anggota dari kedua jenis dalam daftar penyelesaian.
Literal tanggal pertama tahun
Anda dapat memiliki literal tanggal dalam format yyyy-mm-dd, #2015-03-17 16:10 PM#.
Properti antarmuka readonly
Anda dapat menerapkan properti antarmuka readonly menggunakan properti readwrite. Antarmuka menjamin fungsionalitas minimum, dan tidak menghentikan kelas penerapan agar tidak mengizinkan properti diatur.
Untuk keterbacaan lebih lanjut dari kode Anda, Anda sekarang dapat menggunakan TypeOf dengan IsNot.
ID> Peringatan <#Disable dan ID Peringatan <#Enable>
Anda dapat menonaktifkan dan mengaktifkan peringatan tertentu untuk wilayah dalam file sumber.
Penyempurnaan komentar dokumen XML
Saat menulis komentar dokumen, Anda mendapatkan editor cerdas dan membangun dukungan untuk memvalidasi nama parameter, penanganan crefs yang tepat (generik, operator, dll.), mewarnai, dan merefaktor.
Modul parsial dan definisi antarmuka
Selain kelas dan struktur, Anda dapat mendeklarasikan modul dan antarmuka parsial.
#Region direktif di dalam badan metode
Anda dapat menempatkan #Region... #End Pemisah Wilayah di mana saja dalam file, di dalam fungsi, dan bahkan menjangkau seluruh badan fungsi.
Penimpaan definisi secara implisit kelebihan beban
Jika Anda menambahkan pengubah Overrides ke definisi, pengkompilasi secara implisit Overloads menambahkan sehingga Anda dapat mengetik lebih sedikit kode dalam kasus umum.
CObj diizinkan dalam argumen atribut
Kompiler yang digunakan untuk memberikan kesalahan bahwa CObj(...) bukan konstanta ketika digunakan dalam konstruksi atribut.
Mendeklarasikan dan mengkonsumsi metode ambigu dari antarmuka yang berbeda
Sebelumnya kode berikut menghasilkan kesalahan yang mencegah Anda mendeklarasikan IMock atau memanggil GetDetails (jika kode ini telah dinyatakan dalam C#):
Interface ICustomer
Sub GetDetails(x As Integer)
End Interface
Interface ITime
Sub GetDetails(x As String)
End Interface
Interface IMock : Inherits ICustomer, ITime
Overloads Sub GetDetails(x As Char)
End Interface
Interface IMock2 : Inherits ICustomer, ITime
End Interface
Sekarang pengkompilasi akan menggunakan aturan resolusi kelebihan beban normal untuk memilih yang paling tepat GetDetails untuk dipanggil, dan Anda dapat mendeklarasikan hubungan antarmuka di Visual Basic seperti yang ditunjukkan dalam sampel.