Kezdőoldal » Számítástechnika » Programozás » A felsorolás típus (enum)...

A felsorolás típus (enum) értékeihez tudunk a nevükön kívül is információkat csatolni? (C#)

Figyelt kérdés
Pl. ha készítek egy háziállatok nevű enum típust (kutya, macska ...), és később egy osztályban létrehozok egy kisállat nevű háziállatok nevű tulajdonságot, akkor van arra mód, hogy a kisállat értéke alapján a program működése egy bizonyos módon folytatódjon, vagy az osztályban külön-külön kell definiálni a teendőket a kisállat összes lehetséges értéke esetén?

2016. aug. 23. 15:48
 1/5 anonim ***** válasza:
51%
Nevet és értéket adhatsz meg neki, mást nem. Az enum azért létezik, hogy neked könnyebb legyen kezelni a dolgokat anélkül, hogy feleslegesen lassítanád a programod pl string ellenőrzésekkel, a fordító végül sima intekké alakítja ha nem tévedek.
2016. aug. 23. 15:54
Hasznos számodra ez a válasz?
 2/5 anonim ***** válasza:

"vagy az osztályban külön-külön kell definiálni a teendőket a kisállat összes lehetséges értéke esetén"


Ennek leginkább a kisállat osztályban lenne a helye, az elég rossz megoldás, hogy:

switch (allat) case emez case amaz stb.


Szóval nem enumra van szökséged, hanem egy abstract base classra, vagy valami hasonló.

2016. aug. 23. 16:33
Hasznos számodra ez a válasz?
 3/5 anonim ***** válasza:

Esetleg attribútumba még tehetsz dologkat, pl


enum MyEnum

{

[MyAttr("ez az elso")]

EnumVal1,

[MyAttr("ez a masodik")]

Enumval2,

}


Ez pl. hasznos lehet, ah UI-on akarod megjeleniteni pl egy comboboxban az értékeket és lokalizálni kell a megjelenitett értékeket, nem csak simán az Enum.ToString-et akarod látni.


Nyilván elméletben bármire használhatod ezt, akár kódot is irhatsz az attributum értékébe, csak hülyeség lenne, pláne a kérdés leirásban szereplő célra. Neked az kell amit #1 és #2 irt.

2016. aug. 23. 23:03
Hasznos számodra ez a válasz?
 4/5 anonim ***** válasza:
52%

A Te use case-d egy tipikus példa az enum használatára. Annak, ahol használni akarod, megadsz egy Kisállat típusú változót, és switch-case-el befolyásolod a program futását:


switch(pet)

{

case CAT:

cw tabtab "Macska";

break;


case DOG:

cw tabtab "Kutya";

break;


default:

throw new NotImplemented

}



Sima enumba nem tudod, csak a nevet felvenni, de erre van az ún. Smart Enum Pattern:


public sealed class SmartEnum // public sealed, mert kell, h. mindenki lássa, és sealed, mert nem akarsz belőle örökölni.

{

#region Property-k

private ctor{ ... } // Fontos! Ne lehessen példányosítani, csak saját magát, attól enum!


// Enum értékek

public static readonly SmartEnum CAT = new SmartEnum {...};


public static readonly SmartEnum DOG = new SmartEnum {...};

}


// Usage

SmartEnum pet = SmartEnum.CAT;


Hogy szebb legyen, pl. definiálhatod az IEquatable-t, vagy definiálhatsz Id alapján egy implicit operator int-et, mert az alapján tudsz switch-case-t rakni. De vigyázz, ez esetben gondolj ennek mellékhatásaira is!

2016. aug. 24. 07:24
Hasznos számodra ez a válasz?
 5/5 anonim ***** válasza:

Ahogy előttem írták van erre gy Smart Enum pattern.

Ez a lényege, hogy csinálsz egy privát konstruktoros egyedi osztályt és publikus statikus readonly membereket adsz meg neki.

Erről itt tudhadsz meg többet.

[link]

2016. aug. 24. 18:10
Hasznos számodra ez a válasz?

Kapcsolódó kérdések:





Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu

A weboldalon megjelenő anyagok nem minősülnek szerkesztői tartalomnak, előzetes ellenőrzésen nem esnek át, az üzemeltető véleményét nem tükrözik.
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!