ProgrammatieVB.NET ontwikkelaar / Oplossingsarchitect

Hoe wordt er gewerkt met attributen (Attributes) in Visual Basic, hoe maak je eigen attributen aan en hoe gebruik je ze om het gedrag van methoden, klassen of eigenschappen tijdens runtime en compilatie te controleren?

Slaag voor sollicitatiegesprekken met de Hintsage AI-assistent

Antwoord.

Geschiedenis van de vraag

In het .NET-platform, en dus in Visual Basic, zijn attributen geïntroduceerd als een krachtige tool voor het annoteren van verschillende code-elementen met metadata. Dit stelt programma's en tools in staat om tijdens uitvoering en compilatie extra informatie te verkrijgen en het gedrag van methoden, klassen, eigenschappen aan te passen via reflectie-, serialisatie-, automatiseringstestprocessen, enzovoort.

Probleem

Zonder attributen moet extra logica hardcoded worden voor het aanpassen van methoden of klassen, en universele bibliotheken kunnen niet uitbreidbaar en flexibel zijn zonder externe informatie over de klasse of methode. Er is ook een probleem met het doorgeven van configuraties zonder de code zelf te wijzigen.

Oplossing

Attributen zijn speciale klassen die afstammen van Attribute. Ze kunnen worden gemaakt en toegepast op methoden, klassen, eigenschappen, parameters of retourwaarden. Tijdens de uitvoering kunnen deze attributen worden ontdekt via reflectie en kan het gedrag van de bijbehorende logica worden aangepast.

Voorbeeldcode voor het maken en gebruiken van een eigen attribuut:

Imports System <AttributeUsage(AttributeTargets.Class Or AttributeTargets.Method, AllowMultiple:=False)> Public Class InfoAttribute Inherits Attribute Public Property Description As String Public Sub New(desc As String) Description = desc End Sub End Class <Info("Special business logic method.")> Public Sub Calculate() Console.WriteLine("Calculation performed.") End Sub ' Lezing van het attribuut via reflectie Dim method = GetType(Module1).GetMethod("Calculate") Dim attr = CType(Attribute.GetCustomAttribute(method, GetType(InfoAttribute)), InfoAttribute) If attr IsNot Nothing Then Console.WriteLine(attr.Description)

Belangrijke kenmerken:

  • Eigen attributen worden gemaakt vanuit de klassen die afstammen van Attribute
  • Attributen kunnen worden toegepast op verschillende elementen ( AttributeTargets.Class, Method, Property enz.)
  • Worden gebruikt voor serialisatie, validatie, DI-frameworks, aanpassing van gedrag tijdens runtime en bij codegeneratie

Vragen met een valstrik.

Kunnen attributen rechtstreeks het gedrag van een methode of klasse wijzigen zonder reflectie te gebruiken?

Nee, attributen zelf bevatten alleen metadata. Het gedrag van een object kan alleen worden gewijzigd als de aanroepende code of runtime controleert op de aanwezigheid van het attribuut via reflectie en extra acties onderneemt.

Kan dezelfde attribuut meerdere keren op hetzelfde element worden toegewezen, en wat is daarvoor nodig?

Standaard — nee. Hiervoor moet je bij de declaratie van het attribuut AllowMultiple:=True in AttributeUsage opgeven. Dan kan hetzelfde attribuut meerdere keren op één element worden toegepast.

Worden attributen geërfd van een basisklasse naar een afgeleide?

Nee, standaard — ze worden niet geërfd. Als er erfelijkheid vereist is, moet de parameter Inherited:=True in AttributeUsage worden opgegeven.

Typische fouten en anti-patronen

  • Gebruik van attributen zonder verdere analyse of verwerking ervan via reflectie
  • Pogingen om complexe objecten in een attribuut op te slaan, in plaats van eenvoudige (waarde is alleen toegestaan als deze serialiseerbaar is)
  • Het niet opgeven van AttributeTargets, wat leidt tot toewijzingsfouten

Voorbeeld uit het leven

Negatieve case

In een project worden massaal aangepaste attributen toegevoegd aan methoden, maar niemand implementeert de verwerking van deze attributen via reflectie — dergelijke code wordt nutteloze ballast die het onderhoud bemoeilijkt en het lezen van de broncode ingewikkeld maakt.

Voordelen:

  • Gemakkelijk om de juiste label aan het juiste code-element toe te voegen
  • Documentatie wordt vereenvoudigd

Nadelen:

  • Geen invloed op het gedrag van de applicatie
  • Nutteloze complexiteit

Positieve case

Het attribuut wordt gebruikt voor het annoteren van loggingmethoden, en een apart subsysteem ontdekt automatisch via reflectie welke methoden onderhevig zijn aan audit, voegt analytics in en voegt tracing toe. Het gedrag is transparant voor de gebruiker.

Voordelen:

  • Flexibele configureerbaarheid van de applicatie zonder het basiscode te bewerken
  • Uniforme aanpak voor alle methoden
  • Gebruik in DI-containers en ORM

Nadelen:

  • Het is belangrijk om goed na te denken over de infrastructuur voor het verwerken van attributen
  • Het is cruciaal om te vermijden dat een attribuut per ongeluk wordt genegeerd, als het echt nodig is