C# Enum(Enumeration) med eksempel

โšก Smart opsummering

Optรฆllinger i C# definerer et navngivet sรฆt af konstante integralvรฆrdier, sรฅsom ugedagene, hvilket gรธr kode nemmere at lรฆse og vedligeholde. Nรธgleordet enum deklarerer disse faste konstanter รฉn gang til genbrug pรฅ tvรฆrs af et program.

  • ๐Ÿ“ Definition: Enum-nรธgleordet grupperer relaterede navngivne konstanter under รฉn type og erstatter spredte magiske tal med lรฆsbare identifikatorer.
  • ๏ธ Eksempel pรฅ dage: En optรฆlling kaldet Days gemmer ugedage, og Days.Sun returnerer det valgte medlem ved dets navn.
  • ๐Ÿ”ข Underliggende vรฆrdier: Enum-medlemmer knyttes til heltalsvรฆrdier, der starter ved nul og stiger med รฉn, medmindre der tildeles brugerdefinerede tal.
  • ๐Ÿ” Konverteringer: Eksplicite casts omdanner en enum til dens heltal, mens Enum.Parse og Enum.TryParse konverterer tekst tilbage til medlemmer.
  • ๐Ÿšฉ Flag: Flags-attributten lader en enum kombinere flere muligheder som bitfelter ved hjรฆlp af den bitvise OR-operator.
  • ๐Ÿค– AI assistance: GitHub Copilot og ML.NET hjรฆlper med at generere enum-definitioner og knytte enums til maskinlรฆringsfunktioner.

C# Optรฆlling (Enumeration)

C# optรฆlling

En opregning bruges i ethvert programmeringssprog til at definere et konstant sรฆt vรฆrdier. For eksempel kan ugedagene defineres som en opregning og bruges hvor som helst i programmet. I C# defineres opregningen ved hjรฆlp af sรธgeordet 'enum'.

Lad os se et eksempel pรฅ, hvordan vi kan bruge sรธgeordet 'enum'.

I vores eksempel vil vi definere en opregning kaldet dage, som vil blive brugt til at gemme ugedagene. For hvert eksempel vil vi kun รฆndre hovedfunktionen i vores Program.cs-fil.

C# optรฆlling

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace DemoApplication
{
 class Program 
 {
  enum Days{Sun,Mon,tue,Wed,thu,Fri,Sat};
  
  static void Main(string[] args) 
  {
   Console.Write(Days.Sun);
   
   Console.ReadKey();
  }
 }
}

Code Forklaring:-

  1. 'Enum' datatype er specificeret til at erklรฆre en opregning. Navnet pรฅ opregningen er Dage. Alle ugens dage er angivet som vรฆrdier for opregningen.
  2. Endelig bruges console.write-funktionen til at vise en af โ€‹โ€‹vรฆrdierne i opregningen.

Hvis ovenstรฅende kode er indtastet korrekt, og programmet udfรธres korrekt, vil fรธlgende output blive vist.

Output:

C# optรฆlling

Fra outputtet kan du se, at 'Sun'-vรฆrdien for opregningen vises i konsollen.

Hvorfor bruge enums i C#?

Enums gรธr et program nemmere at lรฆse, mere sikkert og enklere at vedligeholde. I stedet for at sprede uforklarlige tal, nogle gange kaldet magiske tal, ud over hele koden, giver en enumeration hver vรฆrdi et beskrivende navn, der angiver dens hensigt.

  • Lรฆsbarhed: Et navn som Days.Fri er langt tydeligere end tallet 5, sรฅ alle, der lรฆser koden, forstรฅr betydningen med det samme.
  • Type sikkerhed: En variabel, der er deklareret med en enum-type, kan kun indeholde รฉt af de definerede medlemmer, hvilket forhindrer ugyldige vรฆrdier i at glideping i.
  • Vedligeholdelse: Relaterede konstanter findes pรฅ รฉt sted, sรฅ tilfรธjelse eller omdรธbning af en vรฆrdi opdaterer hele programmet konsekvent.
  • Databinding: Frameworks som WPF og ASP.NET kan binde en enum til en rulleliste, hvilket gรธr enums nyttige til at bygge brugergrรฆnseflader.

Fordi compileren kontrollerer hver tildeling mod de tilladte medlemmer, hjรฆlper enums ogsรฅ med at opdage fejl tidligt, fรธr programmet kรธrer.

Tildeling af brugerdefinerede vรฆrdier til en C#-enum

Som standard tildeler C# det fรธrste enum-medlem vรฆrdien 0 og รธger hvert efterfรธlgende medlem med รฉn. I Days-optรฆllingen ovenfor er Sun lig med 0, Mon lig med 1, og Sat lig med 6. Du kan tilsidesรฆtte disse standardvรฆrdier ved at tildele eksplicitte tal.

  • Eksplicitte vรฆrdier: Skrivning af enumniveau {Lav = 1, Mellem = 5, Hรธj = 10} sรฆtter hvert medlem til et valgt tal i stedet for standardsekvensen.
  • Delvis opgave: Hvis du kun tildeler en vรฆrdi til nogle medlemmer, fortsรฆtter compileren med at nummerere fra den sidst tildelte vรฆrdi for de efterfรธlgende medlemmer.
  • Underliggende type: En enum gemmer sine medlemmer som standard som int, men du kan basere den pรฅ byte, short eller long for at spare hukommelse eller udvide omrรฅdet.

Brugerdefinerede vรฆrdier er nyttige, nรฅr tallene skal matche et eksternt system, f.eks. databasekoder eller protokolkonstanter, sรฅ enum-vรฆrdien afspejler de faktiske data nรธjagtigt.

Sรฅdan konverterer du C# Enums til int, string og flag

C# har ofte brug for at flytte en enum-vรฆrdi til en anden form, f.eks. ved at gemme den som et tal eller lรฆse den tilbage fra tekst. Disse konverteringer sker pรฅ et par standardmรฅder.

  • Optรฆlling til int: En eksplicit cast som (int)Days.Wed returnerer det underliggende heltal, hvilket er nyttigt til lagring eller aritmetik.
  • int til optรฆlling: Hvis man caster i den anden retning, for eksempel (Days)3, omdannes et tal tilbage til det matchende enum-medlem.
  • Streng at optรฆlle: Enum.Parse og den sikrere Enum.TryParse konverterer et navn som "Fri" til Days.Fri-medlemmet uden at tilfรธje ugyldig tekst.
  • Optรฆlling til streng: Hvis et kald af ToString pรฅ et medlem returneres dets navn, sรฅ Days.Sun.ToString() producerer "Sun" til visning eller logfรธring.
  • Medlemmer pรฅ listen: Enum.GetValues โ€‹โ€‹og Enum.GetNames returnerer alle vรฆrdier eller navne, hvilket er nyttigt, nรฅr menuer udfyldes eller input valideres.

Nรฅr en enum skal reprรฆsentere en kombination af valgmuligheder i stedet for รฉn, skal du anvende attributten Flags og give hvert medlem en potens af to, f.eks. 1, 2, 4 og 8. Du kan derefter kombinere medlemmer med den bitvise ELLER-operator og teste for en specifik mulighed med HasFlag-metoden.

Disse konverteringsteknikker gรธr det muligt for en enum at bevรฆge sig nemt mellem lรฆsbare navne, gemte tal og kombinerede flagsรฆt, keeping Resten af โ€‹โ€‹programmet er bรฅde skrivesikkert og let at fรธlge.

Ofte Stillede Spรธrgsmรฅl

En enum-variabel har som standard vรฆrdien 0, hvor vรฆrdien er knyttet til det medlem, der er lig med 0. Hvis intet medlem er 0, har variablen stadig vรฆrdien 0, sรฅ udviklere definerer ofte fรธrst et Ingen- eller Ukendt-medlem for at undgรฅ forvirring.

En const definerer รฉn navngiven vรฆrdi, mens en enum grupperer et relateret sรฆt af navngivne konstanter under en enkelt type. Enums tilfรธjer ogsรฅ typesikkerhed, fordi en variabel kun kan indeholde et af optรฆllingens definerede medlemmer.

Ja. En enum kan deklareres i et navnerum eller indlejres i en klasse eller struktur, hvilket begrรฆnser dens omfang til den pรฅgรฆldende type. C# tillader dog ikke, at en enum deklareres i en metodes indhold.

Ja. To eller flere medlemmer kan dele det samme underliggende nummer, hvilket gรธr de senere navne til aliaser af det fรธrste. Sammenligninger behandler dem som ligevรฆrdige, og konvertering af denne vรฆrdi til en streng returnerer det navn, der er defineret fรธrst i enum.

En enum er en vรฆrditype, sรฅ den gemmer sine data direkte i stedet for som en reference pรฅ heapen. Den arver fra System.Enum, men opfรธrer sig som integraltypen nedenunder, hvilket gรธr kopiering og sammenligning af enum-vรฆrdier hurtig.

Ja. I ML.NET kan du knytte en enum til en kategorisk funktion eller etiket, ofte ved at konvertere den til dens heltalsvรฆrdi eller en one-hot-kodning. Stรฆrkt typede enums holder inputkolonnerne i en maskinlรฆringspipeline klare og konsistente.

Ja. GitHub Copilot foreslรฅr komplette enum-definitioner, brugerdefinerede vรฆrdier, Flags-attributter og konverteringshjรฆlpere sรฅsom Enum.TryParse i Visual Studio og VS Code. RevSe hvert forslag, da Copilot kan vรฆlge vรฆrdier eller navne, der ikke passer til dit domรฆne.

Brug metoden Enum.IsDefined, som returnerer sand, nรฅr et givet tal eller navn matcher et defineret medlem. Ved at parre den med Enum.TryParse kan du validere brugerinput sikkert, fรธr tekst konverteres til en enum-vรฆrdi.

Opsummer dette indlรฆg med: