Per prima cosa ti incoraggio a leggere questo post di piccole dimensioni di Microsoft.
In C #, le enumerazioni non possono avere un comportamento. Se aiuta, puoi pensare alle enumerazioni come membri di una classe speciale in cui le istanze hanno solo nomi ma non metodi [questo è in senso stretto non una visualizzazione corretta].
I membri della classe tuttavia possono avere metodi utili incorporati in essi.
Esempio
public struct Color {
public static readonly Blue = new Color (0, 0, 255);
public static readonly Red = new Color (255, 0, 0);
//...etc.
public int GetHue() {
//Return the hue of the color
}
public int GetSimilarityCoefficient(Color another_) {
//Some really ingenious algo to identify similarity of colors
}
}
vs.
public enum Color {
Blue,
Red,
Green
} //Cannot do anything much but use if-else/switch-case and make decisions in those blocks
Questo mostra enum in una cattiva luce e quindi viene la domanda -quando usare enum? E quindi arriva una risposta molto personale, anche se spero non largamente respinta,
Personalmente preferisco usare le enumerazioni quando i miei membri hanno solo significati simbolici (cioè sono stati puri) e quando voglio che siano estremamente leggeri e quando voglio assicurarmi che tutte le enumerazioni possano essere prese in considerazione.
Esempio in un modulo con diverse scelte di pulsanti di opzione (diciamo per scegliere quale tipo di copia eseguire),
public enum UserChoice {
Copy,
DeepCopy,
PreviewOnly
}
…
//Somewhere
UserChoice userChoice = form.GetUserChoice();
switch (userChoice) {
case UserChoice.Copy:
//Run the copy algorithm
break;
case UserChoice.DeepCopy:
//Run the deep copy algorithm
break;
//Forgot to handle PreviewOnly —> gives a compile exception
}
Nota che posso realizzare lo stesso usando anche le variabili di classe:
public class UserChoice {
public static UserChoice Copy = new UserChoice();
public static UserChoice DeepCopy = new UserChoice();
public static UserChoice PreviewOnly = new UserChoice();
}
…
//Then somewhere
UserChoice userChoice = form.GetUserChoice();
if (userChoice == UserChoice.Copy) {
//Run the copy algorithm
}
else if (userChoice == UserChoice.DeepCopy) {
//Run the deep copy algorithm
}
//Forgot to handle preview only. No compile exception.
Inoltre, le enumerazioni possono essere bandiere.
[Flags]
public enum UserChoice{
Copy = 0,
Deep = 1,
Preview = 2,
NoActualOp = 4
} //Thus, DeepCopy = Copy | Deep; DeepCopyWithPreview = Copy | Deep | Preview; CopyWithPreviewOnly = Copy | Preview | NoActualOp etc..