Bagikan melalui


Apa yang baru untuk Visual Basic

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:

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

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

Inferensi tuple bernama

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

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 ByRef parameter, 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

NameOf

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.

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

Literal 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 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.

Jenis TypeOf <expr> IsNot <>

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.

Lihat juga