Visual Studio-kompilatoralternativer, Del 2: Option Strict

Dette er den andre i en serie om innstilling av kompilatoralternativer for Visual Studio VB.NET-prosjekter, versjoner 2005-2010. Du får tilgang til det første stykket her. Kompilatoralternativer er innstillinger på prosjektnivå som bestemmer hvordan kompilatoren oppfører seg når den kompilerer koden din. Du viser og angir kompilatoralternativer i Compile-fanen til prosjektegenskapsarket, som vist i figur A. I denne andre delen vil jeg diskutere alternativstreng.

Figur A

Hva det betyr

Alternativ Strict er en enkelt bryter, På eller Av. Den avgjør om VB.NET krever typedeklarasjoner og setter visse begrensninger for implisitte konverteringer. I Visual Studio 2005 og 2008 er det ganske greit; med 2010 blir det litt mer komplisert. Her er et sammendrag av hvordan kompilatoren oppfører seg når alternativstreng er satt til På:

  1. Krever typedeklarasjoner for alle variabler, konstanter, rutineparametere og funksjonsreturverdier, uavhengig av omfang, med mindre : I 2010 er Option Infer satt til På, i hvilket tilfelle er typedeklarasjoner bare nødvendige for rutineparametere, funksjonsreturverdier og variabler utenfor det lokale omfanget.
  2. Ikke tillater sen binding .
  3. I 2010 tillater ikke implisitte konverteringer til Object .

Vi vil diskutere alternativ infer lett her for å holde tingene klare, men vil gå nærmere inn på det i del 3.

Typedeklarasjoner

I VB er en typedeklarasjon ganske enkelt en As-klausul, der du spesifiserer datatypen. Visual Basic er et svakt typet språk, så med mindre du sier til VS annet, vil det la deg kode godt uten å oppgi typer, som jeg har gjort her:

 Dim MysteryVariable = 22205-7509 

Hva slags data inneholder mystervariabelen? Er det et tall, en streng eller noe annet? Det er ikke klart, og ved å sette Option Strict til Av, sier du at det ikke betyr noe. Hvis kompilatoren bestemmer at det er et tall, går det bra med meg. Og hvis den bestemmer at det er en streng, er det bra med meg også. Og bestem deg for at den vil - den vil gjøre sitt beste gjetning, og lagre det på den måten. Dette kalles implisitt typing, eller en type inferanse ; kompilatoren gir fra dataene hva typen er. Slik oppfører VB.NET seg med Option Strict satt til Off.

Å sette alternativ strengt til På tvinger deg til å erklære variabeltyper før du bruker dem, slik:

 Dim PostalCode As String = "22205-7509" 

Nå har ikke kompilatoren lov til å bestemme hva det er. Jeg har fortalt det. Det er en streng.

Som nevnt ovenfor, lar VS 2010 deg slappe av denne begrensningen betydelig ved å slå på alternativet. Option Strict = On i VS 2005 og 2008 tilsvarer nøyaktig Option Strict = On + Option Infer = Off i 2010. Med Option Infer = On, oppfører kompilatoren seg som om Option Strict = Off for alle variabler og konstanter innenfor rutiner . I 2012, med alternativet Infer satt til Av, er "Dim MysteryVariable = 22205-7509" helt lovlig innenfor enhver rutine.

En annen måte å beskrive denne begrensningen (og hvordan den er forklart i MSDN) er å si at den begrenser konverteringer til å utvide konverteringer . Dette betyr ganske enkelt at kompilatoren lar deg stikke en liten variabel inn i en stor variabel, men ikke omvendt, av forhåpentligvis åpenbare grunner. Følgende (utvidet konvertering) er tillatt:

 Dim SmallNumber Som heltall = 1 

Dim BigNumber As Long = 2

BigNumber = SmallNumber

Følgende (innsnevring av konvertering) er ikke:

 Dim SmallNumber Som heltall = 1 

Dim BigNumber As Long = 2

SmallNumber = BigNumber

Uten denne begrensningen starter hver variabel ut som et objekt, og gjør potensielt hver oppgave til en innsnevrende konvertering, der datatap lett kan oppstå.

Denne begrensningen tilsvarer advarselskonfigurasjonen som heter "Implisitt konvertering" (se figur A). Når alternativstreng er satt til På, er "Implisitt konvertering" satt til Feil.

Sen binding

Sen binding refererer til bruken av en egenskap eller metode for en variabel hvis type er Objekt. Med andre ord, det er når du antar at du vet hva variabelen er når du virkelig ikke kan garantere å ha rett. Her er et eksempel på et sent bundet anrop (på MysteryVariable):

 Dim MysteryVariable As Object = "22205-7509" 

Dim MysteryVariableLength Som heltall

MysteryVariableLength = MysteryVariable.Length

MysteryVariable er et objekt, som betyr at det ikke inneholder dataene "22205-7509", det holder bare en peker til dataene. Dermed er datatypen (streng, heltall eller hva som helst) ukjent på kompileringstidspunktet. Det er derfor ingen måte for kompilatoren å vite om MysteryVariable til og med vil ha en Length-egenskap. Så når Option Strict er satt til On, vil ikke kompilatoren la deg kode det på den måten. Den vil vite om MysteryVariable har en slik egenskap før den lar deg skrive den linjen. Alternativ Streng = På betyr at ingen sen binding er tillatt.

Denne begrensningen tilsvarer advarselskonfigurasjonen som heter "Sen binding; samtale kan mislykkes ved kjøretid" (se figur A). Når alternativstreng er satt til På, er "Sen binding; samtale kan mislykkes ved kjøretid" satt til Feil.

Implisitte konverteringer til Object

En implisitt konvertering til objekt skjer når kompilatoren ikke kan se om en variabel er noe annet enn et objekt. Denne begrensningen (som en del av Option Strict) gjelder bare VS 2010, men hovedsakelig for å håndtere ting når Option Infer er av, siden det er da du kan ha variabler uten at en typedeklarasjon implisitt blir konvertert til Object.

Denne begrensningen tilsvarer advarselskonfigurasjonen som heter "Implisitt type; antatt objekt." Når alternativstreng er satt til På, er "Implisitt type; antatt objekt" satt til Feil.

Et siste punkt: Option Strict = On innebærer variable erklæringer, så hvis Option Strict er On, så er Option Explicit.

Hvorfor det er viktig

Hovedfaren for å hoppe over typeerklæring er uforutsigbar oppførsel . Når variabler ikke har noen eksplisitt type, må runtime utlede sin type, noe som betyr at deres type blir bestemt av verdiene de inneholder. Med verdier som "22205-7509", vil det måtte lage en kompilatorversjon av en utdannet gjetning. Det kan representere et postnummer eller en ligning, eller kanskje til og med et område, men i alle fall har du ingen måte å vite på forhånd hvordan kompilatoren vil regjere om dette. Det kommer til å gjøre opp for seg når den får dataene. Og hvis den bestemmer at verdien er en streng, vil den kaste verdien som sådan og returnere "22205-7509". Hvis den bestemmer at det er en ligning, trekker den 7.509 fra 22.205 og returnerer 14.696. Det er vanskelig å forestille seg et program som vil ha uforutsigbarhet som det - med mindre hele poenget med programmet var å gi uforutsigbare resultater!

Problemer som dette kan lett gjemme seg bak små finesser. I de to følgende linjene vil kompilatoren kaste den første som en streng og den andre som et heltall, alt avhengig av om du bruker anførselstegn:

 Dim PostalCode1 = "22205-7509" 

© Copyright 2020 | mobilegn.com