C# Felsorolás (Enumeration) példával

⚡ Okos összefoglaló

A C#-ban a felsorolások konstans integrálértékek elnevezett halmazát definiálják, például a hét napjait, ami megkönnyíti a kód olvasását és karbantartását. Az enum kulcsszó ezeket a fix konstansokat egyszer deklarálja, hogy a programban újra felhasználhatók legyenek.

  • 📐 Meghatározás: Az enum kulcsszó egy típus alá csoportosítja a névvel ellátott konstansokat, a szétszórt mágikus számokat olvasható azonosítókkal helyettesítve.
  • Napok példája: A Days nevű felsorolás a hét napjait tárolja, a Days.Sun pedig a kiválasztott tagot adja vissza a neve alapján.
  • 🔢 Alapvető értékek: Az enumerációs tagok egész értékekre vannak leképezve, amelyek nullától kezdődnek és eggyel növekednek, kivéve, ha egyéni számokat rendelnek hozzá.
  • 🔁 konverziók: Az explicit konverziók az enumot egész számmá alakítják, míg az Enum.Parse és az Enum.TryParse a szöveget taggá alakítja vissza.
  • 🚩 Zászlók: A Flags attribútum lehetővé teszi, hogy egyetlen enum több opciót kombináljon bitmezőkként a bitenkénti VAGY operátor használatával.
  • 🤖 AI segítség: A GitHub Copilot és az ML.NET segítenek enumerációs definíciók generálásában és az enumerációk gépi tanulási funkciókhoz való leképezésében.

C# Enum(felsorolás)

C# felsorolás

A felsorolást bármely programozási nyelvben használjuk egy állandó értékkészlet meghatározására. Például a hét napjai felsorolásként definiálhatók, és a programban bárhol felhasználhatók. A C#-ban a felsorolást az 'enum' kulcsszó segítségével határozzuk meg.

Nézzünk egy példát arra, hogyan használhatjuk az 'enum' kulcsszót.

Példánkban a napok elnevezésű felsorolást fogjuk meghatározni, amely a hét napjainak tárolására szolgál. Mindegyik példa esetében csak a Program.cs fájl fő funkcióját módosítjuk.

C# felsorolás

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 Magyarázat:-

  1. Az "enum" adattípus egy felsorolás deklarálására van megadva. A felsorolás neve Napok. A hét összes napja a felsorolás értékeként van megadva.
  2. Végül a console.write függvény a felsorolás egyik értékének megjelenítésére szolgál.

Ha a fenti kódot megfelelően beírta és a program sikeresen lefut, a következő kimenet jelenik meg.

output:

C# felsorolás

A kimenetből láthatja, hogy a felsorolás 'Sun' értéke megjelenik a konzolban.

Miért használjunk enumokat C#-ban?

Az enumerációk könnyebben olvashatóvá, biztonságosabbá és egyszerűbbé teszik a program karbantartását. Ahelyett, hogy megmagyarázhatatlan számokat, más néven mágikus számokat szórnának szét a kódban, egy felsorolás minden értéknek egy leíró nevet ad, amely kifejezi a célját.

  • Olvashatóság: Egy olyan név, mint a Days.Fri, sokkal egyértelműbb, mint az 5-ös szám, így bárki, aki elolvassa a kódot, azonnal megérti a jelentését.
  • Típusbiztonság: Egy enum típussal deklarált változó csak egy definiált tagot tartalmazhat, ami megakadályozza az érvénytelen értékek elcsúszását.ping be
  • Karbantarthatóság: A kapcsolódó konstansok egy helyen találhatók, így egy érték hozzáadása vagy átnevezése az egész programot konzisztensen frissíti.
  • Kötelező adatok: Az olyan keretrendszerek, mint a WPF és az ASP.NET, képesek egy enumerációt egy legördülő listához kötni, ami hasznossá teszi az enumerációkat felhasználói felületek létrehozásához.

Mivel a fordító minden értékadást ellenőrzi a megengedett tagokkal szemben, az enumerációk segítenek a hibák korai felismerésében, még a program futása előtt.

Egyéni értékek hozzárendelése egy C# enumhoz

Alapértelmezés szerint a C# az első enumerációs tagnak 0 értéket rendel, és minden további tagot eggyel növeli. A fenti Days felsorolásban a Sun egyenlő 0-val, a Mon egyenlő 1-gyel, a Sat pedig egyenlő 6-tal. Ezeket az alapértelmezett értékeket felülbírálhatjuk explicit számok hozzárendelésével.

  • Explicit értékek: Az enum Level {Low = 1, Medium = 5, High = 10} írása minden tagot egy kiválasztott számra állít be az alapértelmezett sorrend helyett.
  • Részleges hozzárendelés: Ha csak néhány tagnak rendelsz értéket, a fordító a következő tagok számozását az utolsó hozzárendelt értéktől kezdve végzi.
  • Alapvető típus: Egy enumeráció alapértelmezés szerint int értékkel tárolja a tagjait, de a memória megtakarítása vagy a tartomány bővítése érdekében használhat bájt, rövid vagy hosszú értéket is.

Az egyéni értékek akkor hasznosak, ha a számoknak egy külső rendszerrel, például adatbáziskódokkal vagy protokollállandókkal kell megegyezniük, így az enum pontosan tükrözi a valós adatokat.

Hogyan konvertáljunk C# enumokat int, string és Flags típusúakká?

A C#-nak gyakran kell egy enumerálási értéket más formába állítania, például számként tárolnia vagy szövegből visszaolvasnia. Ezek az átalakítások néhány szabványos módon történnek.

  • Enumból int-be: Egy explicit konvertálás, mint például az (int)Days.Wed, visszaadja az alapul szolgáló egész számot, ami hasznos tároláshoz vagy aritmetikai műveletekhez.
  • int számot kell felsorolni: A másik irányba történő konvertálás, például (Days)3, egy számot visszaalakít a megfelelő enum taggá.
  • Felsorolandó karakterlánc: Az Enum.Parse és a biztonságosabb Enum.TryParse egy olyan nevet, mint a „Fri”, Days.Fri taggá alakítanak anélkül, hogy érvénytelen szöveget dobnának.
  • Enumerálás karakterlánccá: A ToString függvény bármely tagra történő meghívása visszaadja a nevét, így a Days.Sun.ToString() függvény a „Sun” értéket adja vissza megjelenítésre vagy naplózásra.
  • Listázó tagok: Az Enum.GetValues ​​és az Enum.GetNames függvények minden értéket vagy nevet visszaadnak, ami segít a menük kitöltésében vagy a bevitel validálásában.

Ha egy enumerációnak egy helyett több választási lehetőség kombinációját kell reprezentálnia, alkalmazza a Flags attribútumot, és adjon minden tagnak egy kettő hatványát, például 1, 2, 4 és 8. Ezután a tagokat kombinálhatja a bitenkénti VAGY operátorral, és tesztelheti egy adott opciót a HasFlag metódussal.

Ezek az átalakítási technikák lehetővé teszik, hogy egy enumeráció tisztán mozogjon az olvasható nevek, a tárolt számok és a kombinált jelzőkészletek között, keeping A program többi része típusbiztos és könnyen követhető.

GYIK

Egy enum változó alapértelmezett értéke 0, amely az adott taghoz 0 értékű. Ha egyetlen tag sem 0, a változó értéke továbbra is 0, ezért a fejlesztők gyakran először egy Nincs vagy Ismeretlen tagot definiálnak a félreértések elkerülése végett.

Egy konstans egy elnevezett értéket definiál, míg egy enum egyetlen típus alá csoportosítja a kapcsolódó elnevezett konstansok halmazát. Az enumok típusbiztonságot is biztosítanak, mivel egy változó csak a felsorolás definiált tagjainak egyikét tartalmazhatja.

Igen. Egy enum deklarálható egy névtéren belül, vagy beágyazható egy osztályba vagy struktúrába, ami a hatókörét erre a típusra korlátozza. A C# azonban nem engedélyezi az enum deklarálását egy metódus törzsén belül.

Igen. Két vagy több tag használhatja ugyanazt az alapul szolgáló számot, így a későbbi nevek az első aliasai lesznek. Az összehasonlítások egyenlőként kezelik őket, és az érték karakterlánccá alakítása az enumban elsőként definiált nevet adja vissza.

Az enum egy értéktípus, tehát az adatait közvetlenül, a heap-en tárolja, nem pedig referenciaként. A System.Enum típustól örököl, de az alatta lévő integrál típushoz hasonlóan viselkedik, ami felgyorsítja az enum értékek másolását és összehasonlítását.

Igen. Az ML.NET-ben egy enumerációt leképezhetünk egy kategorikus jellemzőre vagy címkére, gyakran úgy, hogy egész értékre vagy egyszeri kódolásra konvertáljuk. Az erősen tipizált enumerációk tisztán és konzisztensen tartják a gépi tanulási folyamat bemeneti oszlopait.

Igen. A GitHub Copilot teljes enumerációs definíciókat, egyéni értékeket, Flags attribútumokat és konverziós segédprogramokat, például az Enum.TryParse-t a Visual Studio-n belül javasolja. VS Code. RevTekintse meg az egyes javaslatokat, mivel a Copilot olyan értékeket vagy neveket is kiválaszthat, amelyek nem illenek a tartományához.

Használd az Enum.IsDefined metódust, amely igaz értéket ad vissza, ha egy adott szám vagy név megegyezik egy definiált taggal. Az Enum.TryParse metódussal párosítva biztonságosan validálhatod a felhasználói bevitelt, mielőtt a szöveget enum értékké alakítanád.

Foglald össze ezt a bejegyzést a következőképpen: