Delen via


Werken met semantiek

Syntaxisstructuren vertegenwoordigen de lexicale en syntactische structuur van broncode. Hoewel deze informatie alleen voldoende is om alle declaraties en logica in de bron te beschrijven, is het niet voldoende informatie om te bepalen waarnaar wordt verwezen. Een naam kan het volgende vertegenwoordigen:

  • een type
  • een veld
  • een methode
  • een lokale variabele

Hoewel elk van deze unieke verschillen is, is het bepalen waarnaar een id daadwerkelijk verwijst vaak een grondige kennis van de taalregels vereist.

Er zijn programma-elementen die worden weergegeven in broncode en programma's kunnen ook verwijzen naar eerder gecompileerde bibliotheken, verpakt in assemblybestanden. Hoewel er geen broncode en dus geen syntaxisknooppunten of -structuren beschikbaar zijn voor assembly's, kunnen programma's nog steeds verwijzen naar elementen erin.

Voor deze taken hebt u het Semantische model nodig.

Naast een syntactisch model van de broncode bevat een semantisch model de taalregels, zodat u eenvoudig id's kunt vergelijken met het juiste programma-element waarnaar wordt verwezen.

Compilatie

Een compilatie is een weergave van alles wat nodig is om een C# of Visual Basic-programma te compileren, dat alle assemblyverwijzingen, compileropties en bronbestanden bevat.

Omdat al deze informatie zich op één plaats bevindt, kunnen de elementen in de broncode gedetailleerder worden beschreven. De compilatie vertegenwoordigt elk gedeclareerd type, lid of variabele als symbool. De compilatie bevat verschillende methoden waarmee u de symbolen kunt vinden en relateren die zijn gedeclareerd in de broncode of als metagegevens uit een assembly zijn geïmporteerd.

Net als bij syntaxisstructuren zijn compilaties onveranderbaar. Nadat u een compilatie hebt gemaakt, kan deze niet worden gewijzigd door u of iemand anders met wie u de compilatie deelt. U kunt echter een nieuwe compilatie maken op basis van een bestaande compilatie, waarbij u een wijziging opgeeft zoals u dat doet. U kunt bijvoorbeeld een compilatie maken die op elke manier hetzelfde is als een bestaande compilatie, met uitzondering van een extra bronbestand of assembly-verwijzing.

Symbolen

Een symbool vertegenwoordigt een uniek element dat is gedeclareerd door de broncode of geïmporteerd uit een assembly als metagegevens. Elke naamruimte, type, methode, eigenschap, veld, gebeurtenis, parameter of lokale variabele wordt vertegenwoordigd door een symbool.

Een verscheidenheid aan methoden en eigenschappen van het Compilation type helpt u symbolen te vinden. U kunt bijvoorbeeld een symbool voor een gedeclareerd type vinden op basis van de algemene naam van de metagegevens. U kunt de hele symbooltabel ook openen als een structuur van symbolen die zijn geroot door de globale naamruimte.

Symbolen bevatten ook aanvullende informatie die de compiler bepaalt op basis van de bron of metagegevens, zoals andere symbolen waarnaar wordt verwezen. Elk type symbool wordt vertegenwoordigd door een afzonderlijke interface die is afgeleid van ISymbol, elk met zijn eigen methoden en eigenschappen die de informatie beschrijven die de compiler heeft verzameld. Veel van deze eigenschappen verwijzen rechtstreeks naar andere symbolen. De eigenschap geeft bijvoorbeeld IMethodSymbol.ReturnType het werkelijke typesymbool aan dat de methode retourneert.

Symbolen vormen een gemeenschappelijke weergave van naamruimten, typen en leden, tussen broncode en metagegevens. Een methode die is gedeclareerd in broncode en een methode die is geïmporteerd uit metagegevens, worden bijvoorbeeld beide vertegenwoordigd door een IMethodSymbol met dezelfde eigenschappen.

Symbolen zijn vergelijkbaar met het CLR-typesysteem zoals vertegenwoordigd door de System.Reflection API, maar ze zijn rijker omdat ze meer modelleren dan alleen typen. Naamruimten, lokale variabelen en labels zijn allemaal symbolen. Daarnaast zijn symbolen een weergave van taalconcepten, niet CLR-concepten. Er is veel overlap, maar er zijn ook veel zinvolle verschillen. Een iteratormethode in C# of Visual Basic is bijvoorbeeld één symbool. Wanneer de iteratormethode echter wordt vertaald naar CLR-metagegevens, is het een type en meerdere methoden.

Semantisch model

Een semantisch model vertegenwoordigt alle semantische informatie voor één bronbestand. U kunt deze gebruiken om het volgende te ontdekken:

  • De symbolen waarnaar wordt verwezen op een specifieke locatie in de bron.
  • Het resulterende type expressie.
  • Alle diagnostische gegevens, die fouten en waarschuwingen zijn.
  • Hoe variabelen stromen in en uit regio's van de bron.
  • De antwoorden op meer speculatieve vragen.