Apa yang baru untuk Visual Basic

Topik 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 SDK .NET 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
Kata kunci Async dan await, iterator, atribut info penelepon

Visual Basic, Visual Studio 2010
Properti yang diimplementasikan secara otomatis, penginisialisasi koleksi, kelanjutan baris implisit, varians co/contra dinamis, generik, akses namespace layanan global

Visual Basic / Visual Studio 2008
Language Integrated Query (LINQ), harfiah XML, inferensi jenis lokal, penginisialisasi objek, jenis anonim, metode ekstensi, inferensi jenis lokal var, ekspresi lambda, operator if, metode parsial, jenis nilai yang dapat diubah ke null

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. Banyak bagian Visual Basic Runtime bergantung pada WinForms dan ini akan ditambahkan dalam versi Visual Basic yang lebih baru.

Komentar diizinkan di lebih banyak tempat dalam pernyataan

Dalam Visual Basic 15.8 dan versi yang lebih lama, komentar hanya diizinkan pada baris kosong, di akhir pernyataan, atau di tempat-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 15.8 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 ketika Opsi Ketat diatur ke Off:

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

Argumen bernama non-trailing

Dalam 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 di rakitan yang berisi. Karena struktur tidak dapat diwariskan, Private Protected hanya dapat diterapkan pada anggota kelas.

Pemisah heksa/biner/oktal jarak antar baris

Visual Basic 2017 menambahkan dukungan untuk karakter garis bawah (_) sebagai pemisah digit. Dimulai dari Visual Basic 15.5, Anda juga dapat menggunakan karakter garis bawah sebagai pemisah jarak antar baris antara awalan dan digit heksadesimal, biner, atau oktal. Contoh berikut menggunakan pemisah digit jarak antar baris untuk menentukan 3.271.948.384 sebagai angka heksadesimal:

Dim number As Integer = &H_C305_F860

Untuk menggunakan karakter garis bawah sebagai pemisah jarak antar baris, Anda harus menambahkan elemen berikut ke file proyek Visual Basic (*.vbproj):

<PropertyGroup>
  <LangVersion>15.5</LangVersion>
</PropertyGroup>

Visual Basic 15.3

Inferensi tuple bernama

Ketika 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 rakitan referensi, dan -refonly menentukan bahwa hanya rakitan referensi yang akan dihasilkan oleh kompilasi.

Visual Basic 15

Tupel

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 (Class atau Structure). Ini adalah solusi kelas berat.

  • Tentukan satu atau beberapa parameter ByRef, 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 metode TryParse 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 ini.

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 nilai Byte 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 jenis data Byte, Integer, Long, Short, SByte, UInteger, ULong, dan UShort.

Dukungan untuk nilai pengembalian referensi C#

Dimulai dengan C# 7.0, 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 untuk menulis metode dengan nilai pengembalian referensi, tetapi memungkinkan Anda untuk menggunakan dan memodifikasi nilai pengembalian referensi.

Misalnya, kelas Sentence berikut yang ditulis dalam C# menyertakan metode FindNext yang menemukan kata berikutnya dalam kalimat yang dimulai dengan substring tertentu. String dikembalikan sebagai nilai pengembalian referensi, dan variabel Boolean yang 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 kelas Sentence.

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 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 argumen Boolean untuk menentukan apakah kecocokan ditemukan, itu memodifikasi kata pertama jika tidak ada kecocokan. Contoh berikut mengoreksi ini dengan mengganti kata pertama dengan sendirinya 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 lebih lanjut, lihat Nilai Tampilan Referensi.

Visual Basic 14

NameOf

Anda bisa mendapatkan nama string yang tidak memenuhi syarat dari jenis atau anggota untuk digunakan dalam pesan kesalahan tanpa pengodean keras string. Ini memungkinkan kode Anda untuk tetap benar saat merefaktor. Fitur ini juga berguna untuk menghubungkan tautan MVC model-view-controller dan menembakkan peristiwa yang diubah properti.

Interpolasi string

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 adalah null, operasi akan mengembalikan null.

Harfiah string multibaris

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 penginisialisasi, dan di antara istilah ekspresi LINQ.

Resolusi nama yang lebih cerdas yang sepenuhnya 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 laporkan 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.

Harfiah tanggal pertama tahun

Anda dapat memiliki harfiah tanggal dalam format tttt-bb-hh, #2015-03-17 16:10 PM#.

Properti antarmuka readonly

Anda dapat menerapkan properti antarmuka baca-saja menggunakan properti readwrite. Antarmuka menjamin fungsionalitas minimum, dan tidak menghentikan kelas penerapan agar tidak mengizinkan properti diatur.

Jenis TypeOf <expr> IsNot <>

Untuk lebih banyak keterbacaan kode Anda, Anda sekarang dapat menggunakan TypeOf dengan IsNot.

<ID> #Nonaktifkan Peringatan dan <ID> #Aktifkan Peringatan

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 menambahkan Overloads sehingga Anda dapat mengetik lebih sedikit kode dalam kasus umum.

CObj diperbolehkan dalam argumen atribut

Pengkompilasi 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 kompilator akan menggunakan aturan resolusi kelebihan beban normal untuk memilih GetDetails yang paling tepat untuk dipanggil, dan Anda dapat mendeklarasikan hubungan antarmuka dalam Visual Basic seperti yang ditunjukkan dalam sampel.

Lihat juga