Nyheter för Visual Basic
Det här avsnittet innehåller viktiga funktionsnamn för varje version av Visual Basic, med detaljerade beskrivningar av de nya och förbättrade funktionerna i de senaste versionerna av språket.
Aktuell version
Visual Basic 16.9 / Visual Studio 2019 version 16.9
Nya funktioner finns i Visual Basic 16.9.
Du kan ladda ned den senaste .NET SDK:en från nedladdningssidan för .NET.
Tidigare versioner
Visual Basic 16.0 /Visual Studio 2019 version 16.0
Nya funktioner finns i Visual Basic 16.0.
Visual Basic 15.5 /Visual Studio 2017 version 15.5
Nya funktioner finns i Visual Basic 15.5.
Visual Basic 15.3 /Visual Studio 2017 version 15.3
Nya funktioner finns i Visual Basic 15.3.
Visual Basic 15 /Visual Studio 2017
Nya funktioner finns i Visual Basic 2017.
Visual Basic/Visual Studio 2015
Nya funktioner finns i Visual Basic 14.
Visual Basic/Visual Studio 2013
Förhandsversioner av .NET Compiler Platform ("Roslyn")
Visual Basic/Visual Studio 2012
Async
och await
nyckelord, iteratorer, anroparinformationsattribut
Visual Basic, Visual Studio 2010
Automatiskt implementerade egenskaper, insamlingsinitierare, implicit radfortsättning, dynamisk, allmän co/contra-avvikelse, global namnområdesåtkomst
Visual Basic/Visual Studio 2008
Språkintegrerad fråga (LINQ), XML-literaler, slutsatsdragning av lokal typ, objektinitierare, anonyma typer, tilläggsmetoder, lokal var
typinferens, lambda-uttryck, if
operator, partiella metoder, nullbara värdetyper
Visual Basic/Visual Studio 2005
Typ My
och hjälptyper (åtkomst till app, dator, filsystem, nätverk)
Visual Basic/Visual Studio .NET 2003
Bitskiftoperatorer, loopvariabeldeklaration
Visual Basic/Visual Studio .NET 2002
Den första versionen av Visual Basic .NET
Visual Basic 16,9
Visual Basic 16.9 möjliggör förbrukning av init-only-egenskaper.
Visual Basic 16,0
Visual Basic 16.0 fokuserar på att tillhandahålla fler av funktionerna i Visual Basic Runtime (microsoft.visualbasic.dll) till .NET Core och är den första versionen av Visual Basic som fokuserar på .NET Core. Många delar av Visual Basic Runtime är beroende av WinForms och dessa läggs till i en senare version av Visual Basic.
Kommentarer tillåts på fler platser i instruktioner
I Visual Basic 15.8 och tidigare versioner tillåts kommentarer endast på tomma rader, i slutet av en instruktion eller på specifika platser inom en -instruktion där en implicit radfortsättning tillåts. Från och med Visual Basic 16.0 tillåts kommentarer också efter explicita radfortsättningar och inom en instruktion på en rad som börjar med ett blanksteg följt av ett understreck.
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
Optimerad flyttal till heltalskonvertering
I tidigare versioner av Visual Basic gav konvertering av dubbla och enskilda värden till heltal relativt dåliga prestanda. Visual Basic 15.8 förbättrar avsevärt prestandan för flyttalskonverteringar till heltal när du skickar värdet som returneras av någon av följande metoder till någon av de inbyggda Visual Basic heltalskonverteringsfunktionerna (CByte, CShort, CInt, CLng, CSByte, CUShort, CUInt, CULng) eller när värdet som returneras av någon av följande metoder implicit omvandlas till en integrerad typ när Alternativet Strikt är inställt på 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)
Den här optimeringen gör att kod kan köras snabbare – upp till dubbelt så snabbt för kod som utför ett stort antal konverteringar till heltalstyper. I följande exempel visas några enkla metodanrop som påverkas av den här optimeringen:
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
Observera att detta trunkerar snarare än avrundar flyttalsvärden.
Visual Basic 15,5
Icke-avslutande namngivna argument
I Visual Basic 15.3 och tidigare versioner, när ett metodanrop inkluderade argument både efter position och efter namn, måste positionsargument föregå namngivna argument. Från och med Visual Basic 15.5 kan positionella och namngivna argument visas i valfri ordning så länge alla argument upp till det sista positionsargumentet är i rätt position. Detta är särskilt användbart när namngivna argument används för att göra koden mer läsbar.
Följande metodanrop har till exempel två positionsargument mellan ett namngivet argument. Det namngivna argumentet gör det tydligt att värdet 19 representerar en ålder.
StudentInfo.Display("Mary", age:=19, #9/21/1998#)
Private Protected
medlemsåtkomstmodifierare
Den här nya nyckelordskombinationen definierar en medlem som är tillgänglig för alla medlemmar i dess innehållande klass samt av typer som härleds från den innehållande klassen, men endast om de också finns i den innehållande sammansättningen. Eftersom strukturer inte kan ärvas Private Protected
kan endast tillämpas på medlemmar i en klass.
Ledande hex/binär/oktal avgränsare
Visual Basic 2017 lade till stöd för understreckstecknet (_
) som en sifferavgränsare. Från och med Visual Basic 15.5 kan du använda understreckstecknet som en inledande avgränsare mellan prefixet och hexadecimala, binära eller oktala siffror. I följande exempel används en inledande sifferavgränsare för att definiera 3 271 948 384 som ett hexadecimalt tal:
Dim number As Integer = &H_C305_F860
Om du vill använda understreckstecknet som inledande avgränsare måste du lägga till följande element i filen Visual Basic projekt (*.vbproj):
<PropertyGroup>
<LangVersion>15.5</LangVersion>
</PropertyGroup>
Visual Basic 15.3
Namn på tuppelns slutsatsdragning
När du tilldelar värdet för tupplar från variabler, Visual Basic härleder namnet på tuppelns element från motsvarande variabelnamn. Du behöver inte uttryckligen namnge ett tupplar. I följande exempel används slutsatsdragning för att skapa en tuppeln med tre namngivna element, state
, stateName
och 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
Ytterligare kompilatorväxlar
Den Visual Basic kommandoradskompilatorn stöder nu kompilatoralternativen -refout och -refonly för att styra utdata från referenssammansättningar. -refout definierar utdatakatalogen för referenssammansättningen och -refonly anger att endast en referenssammansättning ska matas ut genom kompilering.
Visual Basic 15
Tupplar är en enkel datastruktur som oftast används för att returnera flera värden från ett enda metodanrop. Vanligtvis måste du göra något av följande för att returnera flera värden från en metod:
Definiera en anpassad typ (en
Class
eller enStructure
). Det här är en tungviktslösning.Definiera en eller flera
ByRef
parametrar, förutom att returnera ett värde från metoden.
Visual Basic stöd för tupplar kan du snabbt definiera en tupplar, tilldela semantiska namn till dess värden och snabbt hämta dess värden. I följande exempel omsluts ett anrop till TryParse metoden och en tupplar returneras.
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
Du kan sedan anropa metoden och hantera den returnerade tuppeln med kod som följande.
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
Binära literaler och sifferavgränsare
Du kan definiera en binär literal med hjälp av prefixet &B
eller &b
. Dessutom kan du använda understreckstecknet , _
som en sifferavgränsare för att förbättra läsbarheten. I följande exempel används båda funktionerna för att tilldela ett Byte
värde och för att visa det som ett decimaltal, hexadecimalt och binärt tal.
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)
Mer information finns i avsnittet "Literal assignments" i datatyperna Byte, Integer, Long, Short, SByte, UInteger, ULong och UShort .
Stöd för C#-referensreturvärden
Från och med C# 7.0 stöder C# referensreturvärden. När anropande metod tar emot ett värde som returneras med referens kan det alltså ändra värdet för referensen. Visual Basic tillåter inte att du skapar metoder med referensreturvärden, men det gör att du kan använda och ändra referensreturvärdena.
Följande Sentence
klass som skrivits i C# innehåller till exempel en FindNext
metod som hittar nästa ord i en mening som börjar med en angiven delsträng. Strängen returneras som ett referensreturvärde och en Boolean
variabel som skickas med referens till metoden anger om sökningen lyckades. Det innebär att förutom att läsa det returnerade värdet kan anroparen också ändra det, och den ändringen återspeglas i Sentence
klassen.
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();
}
}
I dess enklaste form kan du ändra ordet som finns i meningen med hjälp av kod som följande. Observera att du inte tilldelar ett värde till metoden, utan snarare till uttrycket som metoden returnerar, vilket är referensreturvärdet.
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.
Ett problem med den här koden är dock att om en matchning inte hittas returnerar metoden det första ordet. Eftersom exemplet inte undersöker värdet för Boolean
argumentet för att avgöra om en matchning hittas ändrar det första ordet om det inte finns någon matchning. I följande exempel korrigeras detta genom att ersätta det första ordet med sig självt om det inte finns någon matchning.
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.
En bättre lösning är att använda en hjälpmetod som referensreturvärdet skickas med referens till. Hjälpmetoden kan sedan ändra argumentet som skickas till den med referens. Följande exempel gör det.
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.
Mer information finns i Referensreturvärden.
Visual Basic 14
Du kan hämta det okvalificerade strängnamnet för en typ eller medlem för användning i ett felmeddelande utan att hårdkoda en sträng. På så sätt kan koden förbli korrekt vid refaktorisering. Den här funktionen är också användbar för att ansluta MVC-länkar för model-view-controller och starta egenskapsändringshändelser.
Du kan använda stränginterpolationsuttryck för att konstruera strängar. Ett interpolerat stränguttryck ser ut som en mallsträng som innehåller uttryck. En interpolerad sträng är lättare att förstå med avseende på argument än sammansatt formatering.
Åtkomst och indexering för null-villkorlig medlem
Du kan testa null på ett mycket lätt syntaktiskt sätt innan du utför en åtgärd för medlemsåtkomst (?.
) eller index (?[]
). De här operatorerna hjälper dig att skriva mindre kod för att hantera null-kontroller, särskilt för fallande datastrukturer. Om den vänstra operanden eller objektreferensen är null returnerar åtgärderna null.
Strängliteraler med flera rader
Strängliteraler kan innehålla sekvenser med ny rad. Du behöver inte längre det gamla arbetet med att använda <xml><![CDATA[...text with newlines...]]></xml>.Value
Kommentarer
Du kan lägga kommentarer efter implicita radfortsättningar, inuti initieringsuttryck och bland LINQ-uttryckstermer.
Smartare fullständigt kvalificerad namnmatchning
Med kod som Threading.Thread.Sleep(1000)
, Visual Basic används för att leta upp namnområdet "Threading" upptäcker du att det var tvetydigt mellan System.Threading och System.Windows. Trådning och rapportera sedan ett fel. Visual Basic överväger nu båda möjliga namnrymder tillsammans. Om du visar slutförandelistan visar Visual Studio-redigeraren medlemmar från båda typerna i slutförandelistan.
Datumliteraler för första året
Du kan ha datumliteraler i yyyy-mm-dd-format, #2015-03-17 16:10 PM#
.
Skrivskyddade gränssnittsegenskaper
Du kan implementera skrivskyddade gränssnittsegenskaper med hjälp av en skrivskyddad egenskap. Gränssnittet garanterar minsta funktionalitet och hindrar inte en implementeringsklass från att tillåta att egenskapen anges.
Om du vill ha mer läsbarhet för din kod kan du nu använda TypeOf
med IsNot
.
#Disable varnings-ID <> och #Enable varnings-ID <>
Du kan inaktivera och aktivera specifika varningar för regioner i en källfil.
Förbättringar av XML-dokumentkommentar
När du skriver dokumentkommenterar får du smart redigeringsprogram och stöd för validering av parameternamn, korrekt hantering av crefs
(generiska objekt, operatorer osv.), färgläggning och refaktorisering.
Partiella modul- och gränssnittsdefinitioner
Förutom klasser och strukturer kan du deklarera partiella moduler och gränssnitt.
#Region direktiv inuti metodorgan
Du kan placera #Region...#End områdesavgränsare var som helst i en fil, inuti funktioner och till och med sträcka sig över funktionskroppar.
Åsidosättningsdefinitioner är implicit överlagringar
Om du lägger till Overrides
modifieraren i en definition lägger kompilatorn implicit till Overloads
så att du kan skriva mindre kod i vanliga fall.
CObj tillåts i attributargument
Kompilatorn som används för att ge ett fel om att CObj(...) inte var en konstant när den användes i attributkonstruktioner.
Deklarera och använda tvetydiga metoder från olika gränssnitt
Tidigare gav följande kod fel som hindrade dig från att IMock
deklarera eller anropa GetDetails
(om dessa hade deklarerats i 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
Nu använder kompilatorn vanliga regler för överbelastningsmatchning för att välja det lämpligaste GetDetails
att anropa, och du kan deklarera gränssnittsrelationer i Visual Basic som de som visas i exemplet.