Visual Studio-kompilatoralternativer, del 3: Alternativ Sammenlign

Dette er den tredje avbetalingen i serien min om innstilling av kompilatoralternativer for Visual Studio VB.NET-prosjekter, versjoner 2005-2010. Les de forrige installasjonene: Innstilling av Visual Studio Compiler-alternativer, del 1 og Visual Studio-kompilatoralternativer, Del 2: Alternativ Strict.

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 ( figur A ). I dette innlegget vil jeg diskutere bryteren Option Compare. Figur A

Hva det betyr

Alternativ Sammenlign er en toalgsbryter som bestemmer hvordan CLR sammenligner strengdata i sammenligningsoperasjoner som bruker =,, og Like operatorer. De to alternativene er Binær (slik C # gjør det) og Tekst . I alle versjoner av VB.NET er standard binær. Så hvis du installerer Visual Studio og ikke endrer noe, vil streng-sammenligningene dine fungere akkurat som i C # i alle tilfeller. (C # -kompilatoren gir deg ikke et valg.)

I motsetning til hva navnet tilsier, påvirker dette ikke de fleste strengesammenligningsmetoder som er tilgjengelige for deg i VB.NET. Det er mange titalls string-sammenligningsmetoder enn =,,, og lignende, og ingen av dem påvirkes av alternativet Sammenlign. Dette inkluderer et bredt utvalg av statiske (delte) og forekomstmetoder på klasser som implementerer IEnumerable og IComparable, for eksempel klassen String, Enumerable og Array. Her er en stort sett komplett liste over metoder som ignorerer alternativ Sammenlign.

string Er lik()

Sammenligne()

enumerable Noen()

Alle()

Inneholder ()

Tydelig()

ElementAt ()

Unntatt()

Først()

FirstOrDefault ()

Gruppe av()

GroupJoin ()

Siste()

LastOrDefault ()

Max ()

Min ()

Rekkefølge etter()

SequenceEqual ()

TakeWhile ()

ThenBy ()

Union ()

Hvor()

Array Finnes ()

Finne()

FindAll ()

FindIndex ()

FindLast ()

FindLastIndex ()

Oversikt over()

LastIndexOf ()

Omvendt()

Sortere()

TrueForAll ()

IComparable Sammenligne med()

Inneholder ()

Slutter med()

Er lik()

Oversikt over()

IndexOfAny ()

LastIndexOf ()

LastIndexOfAny ()

Erstatte()

Dele()

Begynner med()

Dels ()

Dette betyr at som standard alle sammenligningsmetoder du kan påberope deg på en generisk liste, array eller samling, bruker binær sammenligning uansett om du har tenkt det eller ikke, som er metoder i listen ovenfor som du påberoper deg på strenger. Du kan gjøre unntak ved å sette alternativ Sammenlign for moduler, klasser og strukturer.

La oss komme inn på detaljene.

Binary

En binær sammenligning ser på den binære representasjonen av strengdataene, i motsetning til alle slags alfanumeriske representasjoner, for å bestemme om to strenger er ekvivalente. For eksempel er den binære representasjonen av store bokstaver A 01000001. (Unicode og ASCII er forskjellige kodingsskjemaer, men dette er ikke det beste stedet å komme inn på forskjellene, så jeg bruker det enkle tilfellet der ASCII og UTF- 8 er i hovedsak de samme.) En binær sammenligning ser på denne binære representasjonen, ikke den menneskelige lesbare formen for det den representerer.

Betydningen av dette blir tydelig så snart du bryr deg om kodesidens presisjon - det vil si saksfølsomhet, blandede tegnsett eller ethvert scenario der alle mulige tegn må behandles som forskjellige fra alle andre. Den binære UTF-8-representasjonen av små bokstaver a er 01100001 - helt klart ikke det samme som store bokstaver a, som er 01000001. Ved bruk av Binary sammenligning er det ingen måte a = sammenligning av A og a kommer til å returnere True.

Det samme gjelder aksenttegn. Tenk på de forskjellige mulighetene for den ydmyke UTF-8-kodede små bokstaven, når du først har lagt til aksentvariantene.

en Binær verdi Aksent
en 11000011 10100000 Grav
en 11000011 10100001 Akutt
en 11000011 10100010 cirkumfleks
en 11000011 10100011 tilde
en 11000011 10100100 trema
en 11000011 10100101 ring over
æ 11000011 10100110 (ikke en aksent, bare den funky ae)

Som standard vil VB.NET vurdere A a, og a â.

Men streng sammenligning handler ikke bare om ekvivalens; det handler også om forrang (sorteringsrekkefølge). A, a og â er ikke bare ikke like; de har et bestemt sted i kø, det ene før det andre. Denne forekomsten bestemmes av kodesiden. Under den engelske kodesiden ANSI 1252 (som brukes av engelsk og de fleste europeiske språk) gir det en stigende sorteringsrekkefølge som dette:

a <A <â

(MSDN-dokumentasjonen sier at sorteringsrekkefølgen ville være A <a <â, men det er ikke riktig.)

Når du er sortert i stigende rekkefølge på Binær sammenligning ved bruk av kode side 1252, vil en stor bokstav A alltid komme etter en liten bokstav a.

Kodesidene bestemmer forrang for hvert eneste tegn, så uaksenterte og aksentuerte tegn har relativ forrang. I motsetning til MSDN-dokumentasjonen vil en stor bokstav Z ikke nødvendigvis vises før en stor bokstav À. Her er hva du får med ANSI 1252:

a <A <À <â <Z

Det er resultatet av Binær sammenligning - alle mulige karakterrepresentasjoner er unike og har en definert sorteringsrekkefølge.

Tekst

Sammenligning av tekst påvirker sammenligninger som involverer operatørene =,, og Like. Det gjør i hovedsak unntak basert på tekstrepresentasjonen av karakterene. Det viktigste unntaket er at den behandler sak-forskjellige karakterer som de samme for likestilling. sorteringsordren påvirkes ikke. Så under Tekst sammenligne:

A = a

 = â

A Â

Men:

A = a <À <â <Z

Sorteringsrekkefølgen bestemmes av kodesiden, men i en sammenligning av tekst vil sorteringsrekkefølge ikke håndheves hvis du bruker en operatør; det vil bli håndhevet bare hvis du bruker IEnumerable.Sort (), OrderBy () eller ThenBy ().

Les side to for å lære hvorfor det er viktig.

© Copyright 2021 | pepebotifarra.com