Visual Studio-kompilatoralternativ, del 2: Option Strict

Detta är det andra i en serie om inställning av kompilatoralternativ för Visual Studio VB.NET-projekt, versionerna 2005-2010. Du kan komma åt det första stycket här. Compileralternativ är inställningar på projektnivå som avgör hur kompilatorn beter sig när den sammanställer din kod. Du visar och ställer in kompilatoralternativ på fliken Kompilera i projektegenskapsarket, som visas i figur A. I den andra delen kommer jag att diskutera alternativstrikt.

Figur A

Vad det betyder

Alternativ Strict är en enda switch, On eller Off. Den avgör om VB.NET kräver typdeklarationer och sätter vissa begränsningar för implicita konverteringar. I Visual Studio 2005 och 2008 är det ganska enkelt; med 2010 blir det lite mer komplicerat. Här är en sammanfattning av hur kompilatorn beter sig när alternativstrikt är inställt på På:

  1. Kräver typdeklarationer för alla variabler, konstanter, rutinparametrar och funktionsåterföringsvärden, oavsett omfattning, såvida inte : Under 2010 är alternativet Infer inställt på På, i vilket fall typdeklarationer endast krävs för rutinparametrar, funktionsreturvärden och variabler utanför det lokala området.
  2. Tillåter inte sen bindning .
  3. Under 2010 tillåter inte implicita konverteringar till Object .

Vi diskuterar lätt alternativet här för att hålla saker klart, men kommer att gå mer in i det i del 3.

Typdeklarationer

I VB är en typdeklaration helt enkelt en As-klausul, där du anger datatypen. Visual Basic är ett svagt typspråk, så om du inte säger något annat till VS kommer det att låta dig koda glatt med utan att deklarera typer, som jag har gjort här:

 Dim MysteryVariable = 22205-7509 

Vilken typ av data innehåller min mysteriumvariabel? Är det ett nummer, en sträng eller något annat? Det är inte klart, och genom att ställa alternativet Strikt till Av säger du att det inte spelar någon roll. Om kompilatorn beslutar att det är ett nummer är det bra med mig. Och om den bestämmer sig för att det är en sträng så är det bra med mig också. Och besluta att det kommer - det kommer att göra sitt bästa gissning och lagra det på så sätt. Detta kallas implicit typning, eller en typinferens ; kompilatorn tillhandahåller från data vad typen är. Så fungerar VB.NET med alternativstrikt inställt på Av.

Att ställa in alternativet Strikt till På tvingar dig att deklarera variabeltyper innan du använder dem, så här:

 Dim PostalCode As String = "22205-7509" 

Nu får inte kompilatorn bestämma vad den är. Jag har sagt det. Det är en sträng.

Som nämnts ovan låter VS 2010 dig slappna av av denna begränsning väsentligt genom att aktivera alternativet Infer. Option Strict = On i VS 2005 och 2008 motsvarar exakt Option Strict = On + Option Infer = Off under 2010. Med Option Infer = On, fungerar kompilatorn som om Option Strict = Off för alla variabler och konstanter inom rutiner . 2012, med alternativet Infer inställt på Av, är "Dim MysteryVariable = 22205-7509" helt lagligt inom alla rutiner.

Ett annat sätt att beskriva denna begränsning (och hur det förklaras i MSDN) är att säga att det begränsar omvandlingar till att utvidga omvandlingar . Detta betyder helt enkelt att kompilatorn låter dig fästa en liten variabel i en stor variabel, men inte tvärtom, av förhoppningsvis uppenbara skäl. Följande (breddande konvertering) är tillåtet:

 Dim SmallNumber som heltal = 1 

Dim BigNumber så länge = 2

BigNumber = SmallNumber

Följande (begränsande konvertering) är inte:

 Dim SmallNumber som heltal = 1 

Dim BigNumber så länge = 2

SmallNumber = BigNumber

Utan denna begränsning börjar varje variabel som ett objekt, vilket möjliggör varje tilldelning till en minskande konvertering, där dataförlust lätt kan uppstå.

Denna begränsning motsvarar varningskonfigurationen med namnet "Implicit konvertering" (se figur A). När alternativstrikt är inställt på På är "Implicit konvertering" inställd på Fel.

Sen bindning

Sen bindning avser användningen av en egenskap eller metod för en variabel vars typ är Objekt. Med andra ord, det är när du antar att du vet vad variabeln är när du verkligen inte kan garantera att vara rätt. Här är ett exempel på ett senbundet samtal (på MysteryVariable):

 Dim MysteryVariable As Object = "22205-7509" 

Dim MysteryVariableLength som heltal

MysteryVariableLength = MysteryVariable.Length

MysteryVariable är ett objekt, vilket innebär att det inte innehåller data "22205-7509", det har bara en pekare till data. Således är datatypen (sträng, heltal eller vad som helst) okänd vid sammanställningstiden. Det finns därför inget sätt för kompilatorn att veta om MysteryVariable till och med kommer att ha en längdegenskap. Så när alternativet Strikt är inställt på På kommer kompilatorn inte att låta dig koda det på det sättet. Den vill veta om MysteryVariable har en sådan egenskap innan den låter dig skriva den raden. Alternativ Strikt = På betyder att ingen sen bindning är tillåten.

Denna begränsning motsvarar varningskonfigurationen "Sen bindning; samtal kan misslyckas vid körning" (se figur A). När alternativstrikt är inställt på På är "Sen bindning; samtal kan misslyckas vid körning" inställt på Fel.

Implicita konverteringar till Object

En implicit konvertering till objekt sker när kompilatorn inte kan se om en variabel är något annat än ett objekt. Denna begränsning (som en del av Option Strict) gäller endast VS 2010, men främst för att hantera saker när Option Infer är av, eftersom det är när du kan ha variabler utan att en typdeklaration implicit konverteras till Object.

Denna begränsning motsvarar varningskonfigurationen med namnet "Implicit typ; antaget objekt." När alternativet Strikt är inställt på På är "Implicit typ; objekt antaget" inställt på Fel.

En sista punkt: Option Strict = On innebär variabla deklarationer, så om Option Strict är On, så är Option Explicit.

Varför det är viktigt

Huvudfaren för att hoppa över typdeklarationen är oförutsägbart beteende . När variabler inte har någon uttrycklig typ måste runtime dra slutsatsen om deras typ, vilket innebär att deras typ bestäms av de värden de innehåller. Med värden som "22205-7509" kommer det att behöva göra en kompilatorversion av en utbildad gissning. Det kan representera ett postnummer eller en ekvation, eller kanske till och med ett intervall, men i alla fall har du inget sätt att veta i förväg hur kompilatorn kommer att avgöra om detta. Det kommer att bestämma sig när den får informationen. Och om den bestämmer att värdet är en sträng kommer det att kasta värdet som sådant och returnera "22205-7509". Om den beslutar att det är en ekvation kommer den att subtrahera 7 509 från 22 205 och returnera 14, 696. Det är svårt att föreställa sig ett program som vill ha sådan oförutsägbarhet - såvida inte hela poängen med programmet var att ge oförutsägbara resultat!

Problem som detta kan lätt gömma sig bakom små finesser. På följande två rader kommer kompilatorn att kasta den första som en sträng och den andra som ett heltal, allt beroende på om du använder citattecken:

 Dim PostalCode1 = "22205-7509" 

© Copyright 2020 | mobilegn.com